При работе с текстовыми файлами граздо проще работать с данными не как с отдельными символами, а как со строками с помощью функций fgets() и fputs().
Функция fputs() записывает в файл строку, то есть набор символов, который завершается символом '\0'. Она имеет следующий прототип:
int fputs(const char *s, FILE *stream);
Первый параметр функции - записываемая строка, а второй - указатель на файловый поток. В качестве результата функция возвращает неотрицательное целое число. При ошибках в процессе записи возвращается значение EOF.
При записи строки нулевой символ '\0' в файл не записывается.
Например, запишем строку в файл:
#include <stdio.h> int main(void) { // строка для записи char * message = "Hello METANIT.COM!\nAn apple a day keeps the doctor away"; // файл для записи char * filename = "data.txt"; // запись в файл FILE *fp = fopen(filename, "w"); if(fp) { // записываем строку fputs(message, fp); fclose(fp); printf("File has been written\n"); } }
Запись довольно проста: открываем файл на запись и с помощью вызова fputs(message, fp)
записываем в файл искомую строку.
Функция fgets() считывает из файла одну строку и имеет следующий прототип:
char * fgets(char *s, int n, FILE *sream);
Первый параметр char *s
представляет строку, в которую производится считывание. Второй параметр - число n
указывает, сколько символов необходимо считывать.
И третий параметр представляет файловый поток, из которого производится считывание.
При вызове функция считывает из файла не более n-1 символов. Функция прекращает чтение, когда прочтет n-1 символов или встретит символ переноса строки \n. Все считанные символы записываются в строку s, в том числе символ \n. И также конец каждой строки дописывается нулевой символ '\0'.
При успешном завершении функция возвращает указатель s
, а при ошибке или достижении конца файла возвращается значение NULL.
Считаем данные из выше записанного файла "data.txt":
#include <stdio.h> int main(void) { // файл чтения char * filename = "data.txt"; // буфер для считавания данных из файла char buffer[256]; // чтение из файла FILE *fp = fopen(filename, "r"); if(fp) { // пока не дойдем до конца, считываем по 256 байт while((fgets(buffer, 256, fp))!=NULL) { printf("%s", buffer); } fclose(fp); } }
Здеcь открываем файл на чтение и в цикле считываем из файла по 256 символов и выводим их на консоль с помощью вызова fgets(cc, 256, fp)
.
Когда данные в файле закончатся, функция возвратит NULL, и произойдет выход из цикла.
Другой пример работы с текстовыми файлами - копирование содержимого из одного файла в другой:
#include <stdio.h> int main(void) { char * filename1 = "data1.txt"; char * filename2 = "data2.txt"; char buffer[256]; FILE *f1 = fopen(filename1, "r"); // файл на чтение FILE *f2 = fopen(filename2, "w"); // файл на запись if(!f1 || !f2) { printf("Error occured while opening file\n"); } else { // пока не дойдем до конца, считываем по 256 байт из файла f1 while((fgets(buffer, 256, f1))!=NULL) { // записываем строку в файл f2 fputs(buffer, f2); printf("%s", buffer); } } fclose(f1); fclose(f2); return 0; }