Функция fprintf(), printf() в Си и подобные ей функции
Почти в каждом коде есть функция printf(). Эта и родственные ей функции пригодятся вам и при работе с файлами.
С помощью функций семейства printf() в Си можно записывать сформатированный текст прямо в файлы на диске.
Для этого откройте файл путем вызова функции fopen(), используя один из режимов записи. Затем вызовите функцию fprintf() аналогично тому, как вы вызывали функцию printf(), но в качестве первого аргумента задайте переменную типа FILE *.
Например, следующий оператор запишет в файл переменную d типа double, сформатированную в восьми позициях с двумя знаками после запятой:
Особенно полезна функция sprintf() — строковая версия printf() в Си — Объявите строковый буфер для хранения результата, а затем вызовите ее так:
Если d — переменная типа double, то этот оператор поместит в буфер строковое представление переменной d, оканчивающееся нулевым байтом.
Данный код демонстрирует практическое применение функции fprintf() — добавление номеров строк в текстовые файлы.
Скомпилируйте вместе модули. Затем запустите программу и введите имя текстового файла и имя выходного файла, в который будут записаны строки с номерами.
Программа — хорошая иллюстрация принципов обработки файлов, описанных ранее. Кроме того, программа демонстрирует несколько новых приемов.
В строке 13 объявляются две переменных типа char *: inpfname (имя входного файла) и outfname (имя выходного файла). Этим переменным присваивается адреса строк, которые вы введете в ответ на приглашение.
После создания имен файлов, а также открытия входного и выходного файлов (строки 25-30) программа выполняет цикл while (строки 34- 37). В цикле вызывается функция fgets() в Си. Для чтения строк из входного файла, а также функция fprintf(), которая добавляет номер в начало каждой строки и записывает их в выходной файл.
Строка 36 отображает на экране точку для каждой обработанной строки — хороший метод обратной связи при длительном выполнении задачи, который обеспечивает уверенность в том, что программа работает.
Функция perror() (строка 53) демонстрирует удобный способ отображения сообщений об ошибках для различных функций ввода-вывода. Большинство функций устанавливает внутреннюю переменную errno равной значению, представляющему одну или несколько ошибок. Вызов функции реггог() с любым строковым аргументом отобразит эту строку с описанием аварийной ситуации.
С помощью функций семейства 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 комментариев