- •1. Потоки и файлы
- •2. Текстовые потоки
- •3. Двоичные потоки
- •4. Основы файловой системы
- •5. Указатель файла
- •6. Открытие файла
- •7. Закрытие файла
- •8. Запись символа
- •9. Символ конца строки feof()
- •10. Ввод / вывод строк: fputs() и fgets()
- •11. Функция rewind()
- •13. Стирание файлов.
- •14. Дозапись потока
- •15. Функции fread() и fwrite()
- •16. Ввод / вывод при прямом доступе: функция fseek()
- •17. Функции fprinf() и fscanf()
- •18. Стандартные потоки
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);
}
