Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Нейбауэр А. Моя первая программа на С.doc
Скачиваний:
182
Добавлен:
02.05.2014
Размер:
3.75 Mб
Скачать

Чтение строк

Чтение строк из файла осуществляется с помощью функции fgets(). Синтаксис функции:

fgets(string_variable, lenght, file_pointer);

Функция вводит строку целиком до символа новой строки, если ее длина не превышает значения, указанного в параметре lenght минус один символ. Параметр lenght является целым числом либо целочисленной константой или переменной, указывающей максимально возможное количество символов в строке.

Ниже приведена программа, в которой осуществляется чтение имен из файла, созданного в предыдущем примере:

/*fgets.c"/

#include "stdio.h"

main()

{

FILE *fp;

char name[12];

if ((fp = fopen("MYFILE", "r")) == NULL)

{

puts("Невозможно открыть файл");

exit();

}

while(fgets(name, 12, fp) != NULL)

{

printf(name);

}

fclose(fp);

}

Ввод выполняется внутри цикла while до тех пор, пока значение читаемого символа не равно NULL. Как только указатель достигнет конца файла, строковой переменной присваивается значение NULL. При построчном чтении из файла для указания конца файла всегда используется NULL, а EOF используют при посимвольном чтении.

Если вы пишете программу, предназначенную для чтения любого текстового файла, указывайте значение аргумента lenght равным 80.

Кстати, обратите внимание, что функция printf() используется в этом примере для вывода содержимого строковой переменной без указателей формата. Каждая строка, читаемая из файла, включает код «новая строка», который был записан в файл в инструкции fputs("\n", fp);, и никаких дополнительных кодов «новая строка» в параметры функции printf() включать не требуется.

Форматированный ввод и вывод

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

fprintf(file_pointer, control_string, data_list);

fscanf(file_pointer, control_string, data_list);

Программа, приведенная в Листинге 12.3, предназначена для ввода и записи в файл данных инвентарной описи. Первый ввод осуществляется с помощью функции gets() перед началом цикла while. Цикл повторяется, пока длина каждого вводимого имени составляет как минимум один символ. Выполнение цикла прекращается, когда вместо ввода значения имени происходит нажатие клавиши Enter.

Листинг 12.3. Форматированный вывод.

/*fprintf.c*/

#include "stdio.h"

main()

{

FILE *fp;

char name[20];

int quantity;

float cost;

if ((fp = fopen("MYFILE", "w")) == NULL)

{

puts("Невозможно открыть файл");

exit();

}

printf("Введите наименование товара: ");

gets(name);

while (strlen(name) > 0)

{

printf("Введите цену товара: ");

scanf("%f", &cost);

printf("Введите количество единиц товара: ");

scanf("%d", &quantity);

fprintf(fp, "%s %f %d\n", name, cost, quantity);

printf("Введите наименование товара: ");

gets(name);

}

fclose(fp);

}

Обратите внимание, что в последней строке цикла происходит ввод следующего имени. Это позволяет прекратить повторение цикла простым нажатием клавиши Enter. Некоторые начинающие программисты, вероятно, написали бы этот цикл таким образом:

do

{

printf("Введите наименование товара: ");

gets(name);

printf("Введите цену: ");

scanf("%f", &cost);

printf("Введите количество единиц товара: ");

scanf("%d", &quantity);

fprintf(fp, "%s %f %d\n", name, cost, quantity);

}

while (strlen(name) > 0);

и эта программа работала бы столь же успешно, не считая того, что для окончания цикла требовалось бы нажать клавишу Enter трижды: первый раз при вводе названия и еще два раза в ответ на просьбу ввести цену и количество товара.

Внутри цикла while данные о цене и количестве каждого наименования товара вводятся с использованием функции scanf(), а затем записываются на диск с помощью инструкции

fprintf(fp, "%s %f %d\n", name, cost, quantity);

Обратите внимание, что код «новая строка» записывается в файл в конце каждой строки. Если просмотреть содержимое файла с помощью команды TYPE операционной системы MS-DOS, то каждая строка инвентарной описи и на экране будет начинаться с новой строки:

дискеты 1.120000 100

лента 7.340000 150

картридж 75.000000 3

Если бы код «новая строка» не был записан на диск, текст выводился бы подряд, в одну строку на экране, и выглядел примерно так:

дискеты 1.120000 100лента 7.340000 150картридж 75.000000 3

Заметьте, что при этом отсутствует пробел между числом, показывающим количество единиц одного товара, и наименованием следующего. Даже при таком способе записи можно без проблем осуществлять чтение из этого файла, так как компилятор в состоянии различить конец числового значения и начало строки, но что произойдет, если последним значением для каждого наименования товара окажется строка с названием фирмы-производителя? Информация в файле будет выглядеть примерно таким образом:

дискеты 1.120000 Memoryexлента

7.340000 Okaydataкартридж 75.000000 HP

и тогда при чтении данных из файла программа присоединит начало данных о следующем товаре к концу описания предыдущего. Например, данные о первом наименовании товара при этом выглядели бы так:

дискеты 1.120000 Memoryexлента

Все выведенные на диск данные, даже значения типа int или float, хранятся в виде текстовых символов. Об этом мы будем говорить чуть позже.