Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗФ_ОАиП / Лекции ГГУ Скорины - Программирование.doc
Скачиваний:
179
Добавлен:
21.03.2016
Размер:
2.27 Mб
Скачать

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

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

int fprintf(FILE *fp, char *format, ...);

int fscanf(FILE *fp, char *format, ...);

В случае успеха функция fprintf() вернет число записанных байт, в случае ошибки – EOF.

В случае успеха функция fscanf() вернет число успешно прочитанных, преобразованных и сохраненных полей ввода; вернет 0, если не удалось сохранить ни одно поле; вернет EOF при попытке чтения за пределами конца файла.

fout = fopen("out","w"); // текстовый режим

fprintf(fout, “%s %d %d\n”, “abcd”, 10, 100);

=== F4 === out === (13 байтов)

abcd 10 100

=== 16-ричный вид === out ===

61 62 63 64 20 31 30 20 31 30 30 0D 0A

fout = fopen("out","wb"); // двоичный режим

fprintf(fout, “%s %d %d\n”, “abcd”, 10, 100);

=== F4 === out === (12 байтов)

abcd 10 100 // преобразование в строку и вывод в файл

=== 16-ричный вид === out ===

61 62 63 64 20 31 30 20 31 30 30 0A

Задача. Вывести в файл, а затем ввести из файла 5 строк. Каждая из записываемых строк содержит строку с текстом "Line" (5 байт, включая нулевой байт), пробел, целое значение i, пробел и вещественное значение квадратного корня из i.

void main() {

FILE *f;

int i, k;

double d;

char s[] = "Line";

if ((f=fopen("file.txt","w")) == NULL) {

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

}

for(i=1; i<6; i++) {

fprintf(f, "%s %d %.2lf\n", s, i, sqrt(i));// запись в файл

printf("%s %d %.2lf\n", s, i, sqrt(i)); // вывод на экран

}

fclose(f);

printf("\n");

if ((f=fopen("file.txt ","r")) == NULL) {

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

}

for(i=1; i<6; i++) {

fscanf(f, "%s %d %lf", s, &k, &d); // чтение из файла

printf("%s %d %.2lf\n", s, k, d); // вывод на экран

}

fclose(f);

printf("Работа программы завершена успешно\n");

}

//=== Результат работы программы ===

Line 1 1.00

Line 2 1.41

Line 3 1.73

Line 4 2.00

Line 5 2.24

Line 1 1.00

Line 2 1.41

Line 3 1.73

Line 4 2.00

Line 5 2.24

Обратить внимание! Если при выводе в файл между %s и %d не сделать пробел, то в файле текст "Line" склеится с последующим целым числом. После этого при чтении из файла в переменную s будут попадать строки вида "LineN", в переменную k будут считываться старшие цифры корня (до точки), а в переменной d окажутся дробные разряды соответствующего корня.

//=== Результат работы программы ===

Line 1 1.00

Line 2 1.41

Line 3 1.73

Line 4 2.00

Line 5 2.24

Line1 1 0.00

Line2 1 0.41

Line3 1 0.73

Line4 2 0.00

Line5 2 0.24

Хотя читать разносортные данные из файлов и писать их в файлы часто легче всего именно с помошью функций fprintf() и fscanf(), это не всегда самый эффективный способ выполнения операций чтения и записи. Так как данные в формате ASCII записываются так, как они должны появиться на экране (а не в двоичном виде), то каждый вызов этих функций сопряжен с определенными накладными расходами. Поэтому, если есть ограничения на размер файла или скорость работы программы, надо использовать функции fread() и fwrite().