МегаПредмет

ПОЗНАВАТЕЛЬНОЕ

Сила воли ведет к действию, а позитивные действия формируют позитивное отношение


Как определить диапазон голоса - ваш вокал


Игровые автоматы с быстрым выводом


Как цель узнает о ваших желаниях прежде, чем вы начнете действовать. Как компании прогнозируют привычки и манипулируют ими


Целительная привычка


Как самому избавиться от обидчивости


Противоречивые взгляды на качества, присущие мужчинам


Тренинг уверенности в себе


Вкуснейший "Салат из свеклы с чесноком"


Натюрморт и его изобразительные возможности


Применение, как принимать мумие? Мумие для волос, лица, при переломах, при кровотечении и т.д.


Как научиться брать на себя ответственность


Зачем нужны границы в отношениях с детьми?


Световозвращающие элементы на детской одежде


Как победить свой возраст? Восемь уникальных способов, которые помогут достичь долголетия


Как слышать голос Бога


Классификация ожирения по ИМТ (ВОЗ)


Глава 3. Завет мужчины с женщиной


Оси и плоскости тела человека


Оси и плоскости тела человека - Тело человека состоит из определенных топографических частей и участков, в которых расположены органы, мышцы, сосуды, нервы и т.д.


Отёска стен и прирубка косяков Отёска стен и прирубка косяков - Когда на доме не достаёт окон и дверей, красивое высокое крыльцо ещё только в воображении, приходится подниматься с улицы в дом по трапу.


Дифференциальные уравнения второго порядка (модель рынка с прогнозируемыми ценами) Дифференциальные уравнения второго порядка (модель рынка с прогнозируемыми ценами) - В простых моделях рынка спрос и предложение обычно полагают зависящими только от текущей цены на товар.

Пример 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 с использованием данных функций.





©2015 www.megapredmet.ru Все права принадлежат авторам размещенных материалов.