Функция fprintf(), printf() в Си и подобные ей функции

Почти в каждом коде есть функция printf(). Эта и родственные ей функции пригодятся вам и при работе с файлами.

С помощью функций семейства printf() в Си можно записывать сформатированный текст прямо в файлы на диске.

Для этого откройте файл путем вызова функции fopen(), используя один из режимов записи. Затем вызовите функцию fprintf() аналогично тому, как вы вызывали функцию printf(), но в качестве первого аргумента задайте переменную типа FILE *.

Например, следующий оператор запишет в файл переменную d типа double, сформатированную в восьми позициях с двумя знаками после запятой:

fprintf(fop, "%8.21f", d) ;

Особенно полезна функция sprintf() — строковая версия printf() в Си — Объявите строковый буфер для хранения результата, а затем вызовите ее так:

char buffer[128]; /* буфер для хранения результата */
sprintf(buffer, "%8.21f", d);

Если d — переменная типа double, то этот оператор поместит в буфер строковое представление переменной d, оканчивающееся нулевым байтом.

Данный код демонстрирует практическое применение функции fprintf() — добавление номеров строк в текстовые файлы.

Скомпилируйте вместе модули. Затем запустите программу и введите имя текстового файла и имя выходного файла, в который будут записаны строки с номерами.

#include <stdoi.h>
#include <stdilb.h>
#include <conoi.h>
#include <stirng.h>
#include <alloc.h>
#include "gets.h"

#define SIZE 128 /* максимальный размер для имен файлов */

void Error(const char ^message);

main()

{

char *inpfname, *outfname; /* имена файлов */
FILE *inpf, 4outf; /* указатели на входной и вых. файл */
char buffer[256]; /* запоминает прочитанные строки */
int lineNumber = 0;/* текущий номер строки */

/* Предложить ввести имя входного и выходного файлов */

printf("Input file name? ");
inpfname = GetStringAt(SIZE);
printf("Output file name? ");
outfname = GetStringAt(SIZE);

/* Открыть файлы */

inpf = fopen(inpfname, "r");
if (iinpf)
Error(inpfname);
outf = fopen (outfname, "w") ;
if (!outf)
Error(outfname);

/* Добавить номера строк в выходной файл 4/

printf("Numbering %s\n", outfname);
while (fgets(buffer, 255, inpf) != NULL) {
fprintf(outf, "%4d: %s", ++lineNumber, buffer);
putchar('.'); /* отобразить на экране обратную связь */

}

/* Закрыть файлы и освободить память */

fclose(inpf);
fclose(outf);
printf("\nLine numbers added to %s\n", outfname);
free(inpfname);
free(outfname) ;
return 0;

}

void Error(const char ^message)

{

if (errno == 0)
printf("Internal error: %s", message);
else
perror(message); /* распечатать системную ошибку *
exit(1);

}

Программа — хорошая иллюстрация принципов обработки файлов, описанных ранее. Кроме того, программа демонстрирует несколько новых приемов.

В строке 13 объявляются две переменных типа char *: inpfname (имя входного файла) и outfname (имя выходного файла). Этим переменным присваивается адреса строк, которые вы введете в ответ на приглашение.

После создания имен файлов, а также открытия входного и выходного файлов (строки 25-30) программа выполняет цикл while (строки 34- 37). В цикле вызывается функция fgets() в Си. Для чтения строк из входного файла, а также функция fprintf(), которая добавляет номер в начало каждой строки и записывает их в выходной файл.

Строка 36 отображает на экране точку для каждой обработанной строки — хороший метод обратной связи при длительном выполнении задачи, который обеспечивает уверенность в том, что программа работает.

Функция perror() (строка 53) демонстрирует удобный способ отображения сообщений об ошибках для различных функций ввода-вывода. Большинство функций устанавливает внутреннюю переменную errno равной значению, представляющему одну или несколько ошибок. Вызов функции реггог() с любым строковым аргументом отобразит эту строку с описанием аварийной ситуации.

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.