Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / Л№30.Файлы / Лекция №24. Файловая система..odt
Скачиваний:
104
Добавлен:
17.04.2015
Размер:
42.28 Кб
Скачать

11. Функция rewind()

Функция rewind() устанавливает указатель текущей позиции в файле на начало файла, указанного в качестве аргумента этой функции. Иными словами, функция rewind() выполняет "перемотку" (rewind) файла. Вот ее прототип:

void rewind(FILE *уф);

где уф — это допустимый указатель файла.

Чтобы познакомиться с rewind(), изменим программу из предыдущего раздела таким образом, чтобы она отображала содержимое файла сразу после его создания. Чтобы выполнить отображение, программа после завершения ввода "перематывает" файл, а затем с помощью fback() читает его с самого начала. Обратите внимание, что сейчас файл необходимо открыть в режиме чтения/записи, используя в качестве аргумента, задающего режим, строку "w+".

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int main(void)

{

char str[80];

FILE *fp;

if((fp = fopen("TEST", "w+"))==NULL) {

printf("Ошибка при открытии файла.\n");

exit(1);

}

do {

printf("Введите строку (пустую - для выхода):\n");

gets(str);

strcat(str, "\n"); /* ввод разделителя строк */

fputs(str, fp);

} while(*str!='\n');

/* теперь выполняется чтение и отображение файла */

rewind(fp); /* установить указатель

текущей позиции на начало файла. */

while(!feof(fp)) {

fgets(str, 79, fp);

printf(str);

}

return 0;

}

12.Функция ferror()

Функция ferror() определяет, произошла ли ошибка во время выполнения операции с файлом. Прототип этой функции следующий:

int ferror(FILE *уф);

где уф — допустимый указатель файла. Она возвращает значение true (истина), если при последней операции с файлом произошла ошибка; в противном же случае она возвращает false (ложь). Так как при любой операции с файлом устанавливается свое условие ошибки, то после каждой такой операции следует сразу вызывать ferror(), а иначе данные об ошибке могут быть потеряны.

В следующей программе показано применение ferror(). Программа удаляет табуляции из файла, заменяя их соответствующим количеством пробелов. Размер табуляции определяется макросом TAB_SIZE. Обратите внимание, что ferror() вызывается после каждой операции с файлом. При запуске этой программы указывайте в командной строке имена входного и выходного файлов.

/* Программа заменяет в текстовом файле символы

табуляции пробелами и отслеживает ошибки. */

#include <stdio.h>

#include <stdlib.h>

#define TAB_SIZE 8

#define IN 0

#define OUT 1

void err(int e);

int main(int argc, char *argv[])

{

FILE *in, *out;

int tab, i;

char ch;

if(argc!=3) {

printf("Синтаксис: detab <входной_файл> <выходной файл>\n");

exit(1);

}

if((in = fopen(argv[1], "rb"))==NULL) {

printf("Нельзя открыть %s.\n", argv[1]);

exit(1);

}

if((out = fopen(argv[2], "wb"))==NULL) {

printf("Нельзя открыть %s.\n", argv[2]);

exit(1);

}

tab = 0;

do {

ch = getc(in);

if(ferror(in)) err(IN);

/* если найдена табуляция, выводится

соответствующее число пробелов */

if(ch=='\t') {

for(i=tab; i<8; i++) {

putc(' ', out);

if(ferror(out)) err(OUT);

}

tab = 0;

}

else {

putc(ch, out);

if(ferror(out)) err(OUT);

tab++;

if(tab==TAB_SIZE) tab = 0;

if(ch=='\n' || ch=='\r') tab = 0;

}

} while(!feof(in));

fclose(in);

fclose(out);

return 0;

}

void err(int e)

{

if(e==IN) printf("Ошибка при вводе.\n");

else printf("Ошибка привыводе.\n");

exit(1);

}