Пример 17.2. Считывание текстовой информации из файла.-Работает #include <stdio.h> #include <iostream.h> #include <conio.h> int main() { char str_file[]="String for file"; // Строка для файла FILE* fp = fopen("prim17-1.txt","w"); if(fp != NULL) { printf("Идет запись информации в файл…\n"); for(int i=0;i < strlen(str_file);i++) putc(str_file[i],fp); } else printf("Невозможно открыть файл на запись.\n"); fclose(fp); cout << "\nНажмите любую клавишу..." ; getch(); return 0; } Замечание: на экран будет выведена строка "String for file", хранящаяся в файле с именем "prim17-1.txt", сформированном в предыдущем примере (программе). В приведенном примере функция fopen() открывает файл на чтение, что определяется значением второго аргумента равного «r». Это значит, что в него невозможно произвести запись данных, а только считывание. Сначала выполняется цикл while, в котором из файла считывается символ с помощью функции getc() и выполняется проверка: если считанное значение не равно символу конца файла EOF, то значение переменной ch записывается в массив strfile. Данный цикл будет выполняться до тех пор, пока не будут считаны все символы из файла, т.е. пока не будет достигнут символ EOF. После завершения цикла формируется строка strfile, которая выводится на экран с помощью функции printf(). Перед завершением программы также выполняется функция закрытия файла fclose(). Пример 17.3.Чтение одного элемента из файла, обработка и запись результата в текстовый файл.-Работает #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <iostream.h> int main() { FILE *f; int dig; if ((f = fopen("prim17-3.txt","r")) == NULL) // открыть файл для чтения { printf("Невозможно открыть файл!\n"); exit(0); } fscanf(f, "%d", &dig); // считать значение dig из файла fclose(f); // закрыть файл f = fopen("prim17-3-1.txt","w"); // открыть файл для записи fprintf(f, "We have read the number %d", dig); fclose(f); // закрыть файл cout << "\nНажмите любую клавишу..." ; getch(); return 0; } Мы использовали один и тот же указатель на файловый поток дважды, так как прежде, чем обращаться к нему вторично, закрыли связанный с ним файл и освободили, таким образом, указатель. Примечание к примеру 17.3: – исходное число в файле prim17-3.txt : 2345 – сформированный текст в файле prim17-3-1.txt : We have read the number 2345 В приведенном примере имя файла было записано непосредственно в операторе открытия файла. Но можно сообщить имя открываемого файла, введя его с клавиатуры или пользуясь аргументами командной строки. Пример 17.4.Написать программу, которая сжимает содержимое файла, записывая в выходной файл лишь каждый третий символ из входного файла. -Работает #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> #include <iostream.h> int main(int argc, char *argv[]) { FILE *f_in = fopen("prim17-4.txt","r"); // имя входного файла FILE *f_out = fopen("prim17-4-1.txt","w"); // имя выходного файла int ch; int count = 0; // счетчик элементов if (f_in != NULL) { while((ch = fgetc(f_in)) != EOF) if (count++ % 3 == 0) fputc(ch, f_out); // выводит каждый третий символ fclose(f_in); fclose(f_out); } else printf("Невозможно открыть файл\n "); cout << "\nНажмите любую клавишу..." ; getch(); return 0; } Примечание к примеру 17.4: – исходный текст в файле prim17-4.txt : String for file – сформированный текст в файле prim17-4-1.txt : Si ri При работе с текстовыми файлами возможна не только поэлементная обработка файлов, но и построчная. Пример 17.5.Построчное чтение информации из входного файла и вывод ее на экран как на стандартное устройство вывода.Не работает !!!!! #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> void main(int argc, char *argv[]) { FILE *f_in; char buffer[256]; // максимальная длина строки - 255 символов char *name; // имя входного файла if (argc<2) // в командной строке нет имени { printf("Введите имя входного файла"); gets(name); } else name = argv[1]; // взять имя из командной строки if ((f_in = fopen(name, "r")) != NULL) { while (fgets(buffer,255,f_in)) != NULL) { fputs(buffer, stdout); fputc('\n', stdout); } fclose(f_in); } else printf("Невозможно открыть файл\n "); } В цикле while присутствуют две файловые функции работы со строками: fgets() для чтения строки символов в буфер и fputs() - для записи содержимого буфера в файл. Закрыть файл не менее важно, чем открыть его, так как в этот момент происходит заполнение ячейки таблицы размещения файлов значением, которое является признаком завершения файла и установка атрибутов файла. Кроме того, вывод текстового файла буферизован. Это значит, что в тот момент, когда работает оператор записи в файл, фактическая запись может и не происходить, поскольку реально сначала происходит заполнение данными текстового буфера, а потом его содержимое записывается на диск. Запись буфера происходит как только он окажется полностью заполненным или при выполнении специальных команд принудительной записи на диск. Процесс записи недозаполненного буфера на диск называется флэшированием и обычно выполняется с помощью функции fflush(f_out). При необходимости завершить работу сразу со всеми открытыми файлами пользуются функцией flushall(). Закрытие файла посредством функции fclose(f_out) также включает процесс флэширования, то есть перенос информации из буфера на диск. Доступ к элементам текстовых файлов возможен только в последовательном режиме как при записи файла, так и при его чтении. Работа с текстовыми файлами через функции putc и getc не всегда удобна. Например, если необходимо записать или считать строку целиком, то желательно иметь функции, выполняющие эту работу. В качестве таковых можно воспользоваться функциями fputs() и fgets() для работы со строками. Перепишем предыдущие примеры 17.1 и 17.2 с использованием данных функций. |