Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Рацеев С.М. Программирование на языке Си.pdf
Скачиваний:
369
Добавлен:
23.03.2016
Размер:
1.65 Mб
Скачать

int rewind(FILE *f)

Перемещение указателя в начало файла. Данный оператор эквивалентен записи

fseek(f, 0, SEEK_SET);

long ftell(FILE *f)

Возвращает текущую позицию указателя файла f; в случае ошибки функция возвращает -1.

int ferror(FILE *f)

Возвращает ненулевое значение, если при очередной операции при работе с файлом f произошла ошибка, в противном случае возвращается 0.

13.2. Текстовые файлы

Текстовый файл – последовательность строк, причем каждая строка заканчивается символом ‘\n’. Текстовый файл состоит из обычных печатных символов (в кодах ASCII), включая пробелы, символы новой строки, символы табуляции. Например, в текстовом файле целое число 123 представлено тремя символами-цифрами ‘1’, ‘2’ и ‘3’, которые в файле расположены друг за другом, образуя слово “123”.

Приведем примеры использования библиотечных функций для работы с текстовыми файлами.

Пример 1 (функция fputc()). Ниже приводится функция посимвольной записи в файл с именем fileName, которая продолжается до тех пор, пока в стандартном потоке не встретится имитация признака конца файла EOF.

Многие операционные системы позволяют имитировать условие конца файла с помощью клавиатуры. В системе MS-DOS для этого используется комбинация клавиш Ctrl+z, после чего следует нажать клавишу Enter. В среде Windows для имитации конца файла используется комбинация клавиш Ctrl+z, а в среде UNIX – Ctrl+d.

213

int CreateTextFile(char *fileName)

{

FILE *f; char c;

if ((f = fopen(fileName, "w")) == NULL) return 1;

while ((c = getchar()) != EOF) fputc(c, f);

fclose(f); return 0;

}

Пример 2 (функция fgetc()). Вывод содержимого текстового файла на экран. Функция считывает из файла по одному символу и выводит считанные символы на экран.

int ReadTextFile(char *fileName)

{

FILE *f; char c;

if ((f = fopen(fileName, "r")) == NULL) return 1;

while ((c = fgetc(f)) != EOF) putchar(c);

fclose(f); return 0;

}

Пример 3 (функция fputs()). Построчное заполнение файла. Как и в примере 1, в следующей программе ввод строк совершается до тех пор, пока в стандартном потоке не встретится имитация признака конца файла EOF.

int CreateTextFile(char *fileName)

{

FILE *f; char s[500];

214

int i;

if ((f = fopen(fileName, "w")) == NULL) return 1;

while (fgets(s, 500, stdin) != NULL)

fputs(s, f); /* записываем строку s в файл */ fclose(f);

return 0;

}

Пример 4 (функция fgets()). Построчное чтение файла.

int ReadTextFile(char *fileName)

{

FILE *f;

char line[500];

if ((f = fopen(fileName, "r")) == NULL) return 1;

while (fgets(line, 500, f) != NULL) printf(line);

fclose(f); return 0;

}

Функции, работающие с символами и строками, предназначены только для чтения и записи текста. Если требуется записать или считать из файла данные, содержащие числовые значения, то нужно использовать функции fprintf() и fscanf().

Пример 5 (функция fprintf()). Следующая функция записывает в текстовый файл сведения о работниках некоторой организации: фамилия работника, год рождения, заработная плата. Ввод данных с клавиатуры прекращается в том случае, когда на запрос ввести очередную фамилию работника пользователь введет строку

“000”.

int CreateFile(char *fileName)

{

215

FILE *f;

 

 

char name[50];

/* фамилия

*/

int year;

/* год рождения

*/

float earnings;

/* заработная плата */

if ((f = fopen(fileName, "w")) == NULL) return 1;

printf("name: "); scanf("%s", name);

while (strcmp(name, "000"))

{

printf("year: "); scanf("%d", &year); printf("earnings: "); scanf("%f", &earnings);

fprintf(f, "%s %d %.2f\n", name, year, earnings); printf("name: ");

scanf("%s", name);

}

fclose(f); return 0;

}

Пример 6 (функция fscanf()). Чтение записей из файла, содержащего сведения о работниках. Создание данного файла приводится в предыдущем примере.

int ReadFile(char *fileName)

 

 

{

 

 

FILE *f;

 

 

char name[50];

/* фамилия

*/

int year;

/* год рождения

*/

float earnings;

/* заработная плата */

if ((f = fopen(fileName, "r")) == NULL) return 1;

while (fscanf(f, "%s%d%f", name, &year, &earnings) == 3)

{

printf("%s %d %.2f\n", name, year, earnings);

216

}

fclose(f); return 0;

}

Пример 7 (функция fscanf()). Следующая функция выделяет все слова из текстового файла, которые разделены пробельными символами (‘ ’, ‘\t’, ‘\n’), и выводит данные слова на экран.

int ReadWords(char *fileName)

{

FILE *f; char s[500];

if ((f = fopen(fileName, "r")) == NULL) return 1;

while (fscanf(f, "%s", s) == 1) puts(s);

fclose(f); return 0;

}

Пример 8. В текстовом файле заменить все подряд идущие символы со значением x одним символом x.

int Zamena(char *fname1, char *fname2, char x)

{

FILE *f, *g; char c;

int n;

if ((f = fopen(fname1, "r")) == NULL) return 1;

if ((g = fopen(fname2, "w")) == NULL)

{

fclose(f); return 1;

}

c = fgetc(f);

217