Краткие теоретические сведения

Существуют два основных типа файлов: текстовые и двоичные. Файлы позволяют пользователю считывать большие объемы данных непосредственно с диска, не вводя их с клавиатуры.

Текстовыми называются файлы, состоящие из любых символов. Они организуются по строкам, каждая из которых заканчивается символом «конец строки». Конец самого файла обозначается символом «конец файла». При записи информации в текстовый файл, просмотреть который можно с помощью любого текстового редактора, все данные преобразуются к символьному типу и хранятся в символьном виде.

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

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

Логический файл описывается как указатель на открываемый поток FILE * и служит средством взаимодействия с физическим файлом. Имя физического файла появляется в программе всего один раз, в тот момент, когда происходит открытие файла, осуществляемое функцией fopen() и одновременно его связывание с логическим файлом.

Основными действиями, производимыми над файлами, являются их открытие, обработка и закрытие. Обработка файлов может заключаться в считывании блока данных из потока в оперативную память, запись блока данных из оперативной памяти в поток, считывание определенной записи данных из потока, занесение определенной записи данных в поток. При этом необходимо помнить, что понятие файла в памяти ЭВМ не определено, и приобретает смысл только после его связи с внешним физическим файлом.

Текстовые файлы

Тип FILE определяется в заголовочном файле stdio.h и обычно представляет собой структуру, содержащую параметры реализации потока, такие как адреса буферов, указатели позиций потока, маркеры ошибок потока и т.д.

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

fopen("имя_файла", "режим_доступа")

1. FILE *fopen(const char *filename, const char *mode); Открывает файл. Возвращает указатель на структуру доступа к файлу.

Параметры: filename - путь к файлу, mode - режим открытия:

"r" только для чтения. Если файл не существует, возвращает NULL;

"w" только для записи. Если файл существует, содержимое файла

теряется.

"a" открывает для дозаписи. При необходимости файл создается.

"r+" для чтения и записи. Файл должен существовать.

"w+" для чтения и записи. При необходимости файл создается.

Таким образом, чтобы открыть текстовый файл, например, для чтения, нужно произвести следующие действия:

FILE *ft; // объявили указатель на файловый поток

ft = fopen("inp_f.txt","r"); // открыли файл inp_f.txt

При попытке открыть существующий файл можно допустить ошибку в его имени или в указании пути к нужному файлу. Это вызывает ошибку исполнения программы. Следует предвидеть подобные ситуации и проводить проверку возможности открытия файла. Такую проверку осуществить довольно легко, так как функция fopen() возвращает значение указателя в случае успешного его открытия и значение NULL, если доступ к файлу невозможен. Поэтому достаточно написать:

if (ft = fopen("inp_f.txt","r")!= NULL)

{ // обработка файла

}

Текстовой файл состоит из последовательности символов, разбитой на строки путем использования управляющего символа \n. На диске текстовые файлы хранятся в виде сплошной последовательности символов, и их деление на строки становится заметным лишь в момент вывода на экран или печать, так как именно при выводе управляющие символы начинают выполнять свои функции. Текстовые файлы легко переносятся с одного типа компьютера на другой лишь в случаях, когда они содержат только символы, принадлежащие стандартному набору символов.

При работе с текстовыми файлами возможна их посимвольная или построчная обработка.

Основные методы обработки текстовых файлов

Файловые функции ввода/вывода fprintf() и fscanf() работают аналогично функциям printf() и scanf(), но имеют дополнительный аргумент, являющийся указателем на файловый поток.

Пример 1. Написать программу, которая сжимает содержимое файла, записывая в выходной файл каждый пятый символ из входного файла.

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <string.h>

void main(int argc, char *argv[])

{ FILE *f_in, *f_out;

int ch;

char *name; // имя входного файла

int count = 0; // счетчик элементов

if (argc<2) // в командной строке нет имени

{ printf("Введите имя входного файла");

gets(name);

}

else name = argv[1]; // взять имя из командной строки

if ((f_in = fopen(name, "r"))!= NULL)

{ strcat(name, ".out"); // добавляет расширение.out

// к имени файла

f_out = fopen(name, "w"); // открывает файл для записи

while((ch = fgetc(f_in))!= EOF)

if (count++ % 5 == 0)

fputc(ch, f_out); // выводит каждый третий символ

fclose(f_in);

fclose(f_out);

}

else printf("Невозможно открыть файл\n ");

}

При работе с текстовыми файлами возможна не только поэлементная обработка файлов, но и построчная.

Пример 2. Построчное чтение информации из входного файла и вывод ее на экран.

#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)

{ puts(buffer);

putc('\n');

}

fclose(f_in);

}

else printf("Невозможно открыть файл\n ");

}

В цикле while присутствуют две файловые функции работы со строками: fgets() для чтения строки символов в буфер и fputs() - для записи содержимого буфера в файл.

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

2. int fclose(FILE *stream);

Закрывает открытый с помощью fopen файл.

3. int feof(FILE *stream);

Возвращает ненулевое значение, если указатель чтения-записи вышел за пределы файла.

4. int fprintf(FILE *stream, const char *format [, argument ]...);

Действует аналогично printf, но весь вывод перенаправляется в файл stream.

5. int fscanf(FILE *stream, const char *format [, argument ]...);

Действует аналогично scanf, но символьная строка считывается из файла stream.

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

Если требуется сохранять и восстанавливать числовые данные без потери точности, то лучше использовать fread(), fwrite(). Если обрабатывается текстовая информация, которая будет просматриваться обычными текстовыми редакторами, то используется fgetс()- посимвольное чтение файла, посимвольная запись в файл - fputc() или функции fscanf(), fprintf(). Для чтения из файла и записи в файл строки используются функции fgets() и fputs().

Пример 3. Создать текстовый файл "new1.txt" записав в него строку из 50 символов. Все символы, отличные от пробела, переписать в новый файл "new2.txt":

#include <stdio.h>

#include <conio.h>

#include <string.h>

main()

{ char ch, sl[50];

char text[]="one to tree four";

FILE *pf, *pr; // Указатели на файлы

pf=fopen("new1.txt","w"); // Создание нового файла new1.txt

clrscr();

fprintf(pf,"%s\n",text); // Запись в файл строки text

fclose(pf); // Закрытие файла pf

pf=fopen("new1.txt","r"); // Открытие файла pf для чтения

pr=fopen("new2.txt","w"); // Создание нового файла new2.txt

while (!feof(pf)) // Пока не конец файла

{ ch=getc(pf); // Чтение символа ch из файла pf

if (ch!= ' ')

putc(ch,pr); // Запись в файл pr символа ch

}

fclose(pr); // Закрытие файла pr

rewind(pf); // Возврат указателя на начало файла pf

fgets(sl,50,pf); // Чтение из файла pf строки в переменную sl

printf("%s\n",sl); // Вывод строки sl на дисплей

pr=fopen("new2.txt","r"); // Открытие файла pr для чтения

while (!feof(pr)) // Пока не конец файла pr

{ ch=getc(pr); // Чтение символа из файла pr

putchar(ch); // Вывод символа ch на дисплей

}

fclose(pf); // Закрытие файлов

fclose(pr);

getch();

}

При чтении текстовых файлов лучше использовать функции getc или fgetc, так как при использовании fscanf (pr, “%s”, sl) читается только очередное слово до пробела или символа табуляции и требуется повторение этой функции многократно для других слов.

 

Постановка задачи

Написать программу, осуществляющую следующие действия:

1. ввод исходных данных, описанных под пунктом a), с клавиатуры в файл;

2. ввод данных, описанных под пунктом b), с клавиатуры в файл исходных данных в режиме добавления;

3. чтение исходных данных из файла в переменные, указанные под пунктом c);

4. обработку исходных данных в соответствии с заданием (см. пункт d));

5. формирование результирующего файла, включающего в себя исходные данные с комментариями, вид произведенной обработки и результат обработки.

 

Варианты

1. a) 20 целых чисел, b)некоторое число, c) массив A[5][5] и число C, d) создать одномерный массив B, элементы которого есть числа массива A большие числа C;

2. a) предложение, заканчивающееся точкой, b) слово, c) строки strk1 и strk2, d) подсчитать сколько раз слово strk1 встречается в предложении strk2;

3. a) 10 вещественных чисел, b) 10 вещественых чисел, c) массивы A[10] и B[10], d) создать массив C, содержащий элементы массива A, большие соответствующих элементов массива B;

4. a) строка символв, b) символ, c) строка символов strk1 и символ ch, d) подсчитать сколько раз символ ch встречается последовательно в строке strk1;

5. a) 15 натуральных чисел, b) число, c) массив A[3][5] и число B, d) подсчитать сумму элементов массива A, лежащих в диапазоне от -B до B;

6. a) предложение, b) символ, c) строка strk1 и символ ch, d) подсчитать сколько слов в предложении начинается с символа ch;

7. a) 10 вещественных чисел, b) 7 вещественных чисел, c) массивы A[10] и B[7], d) сформировать массив C[17] из элементов массивов A и B, таким образом, чтобы элементы в массиве C располагались в порядке убывания;

8. a) предложение, b) два символа, c) строка strk и символы ch1 и ch2, d) в предложении заменить символ ch1 на символ ch2 в случае, когда ch1 располагается в середине слова;

9. a) 12 целых чисел, b) число, c) массив A[12] и число B, d) сформировать массив C, такой, что C[i]=(A[i-1]+A[i+1])/B;

10. a) предложение без знаков препинания, b) знаки ',' и '.' в символы ch1 и ch2, c) строка strk1 и символ ch1 ='.' и ch2 =',' d) в строке расставить знаки препинания таким образом, чтобы точка стояла перед заглавной буквой и в конце предложения, а запятая - между двумя пробелами;

11. a) 20 целых чисел, b) целое число B, c) массив A[20] и число B, d) сформировать массив C, элементы которого есть порядковые номера положительных элементов массива A, больших числа B;

12. a) 20 цифр, b) число, c) массив A[20] и число B, d) найти и вывести максимальную неубывающую последовательность в массиве A;

13. a) 10 вещестенных чисел, b) 10 вещественных чисел, c) массивы A[10] и B[10], d) создать массив C из элементов массива A и B, больших нуля и расположить их в порядке убывания;

14. a) предложение, b)символ, c) строка strk1 и символ, d) их предложения удалить все слова, содержащие символ ch;

15. a) 7 целых чисел, b) 7 целых чисел, c) массивы A[7] и B[7], d) переставить элементы между массивами таким образом, чтобы в A были только положительные числа, а в B - только отрицательные;

16. a) предложение, b) слово, c) строки strk1 и strk2, d) удалить из предложения strk1 все повторяющиеся слова, и заменить их на слова strk2.

 

Содержание отчета

1. Постановка задачи для конкретного варианта.

2. Исходные данные.

3. Текст программы.

4. Результаты выполнения программы.

 


Дата добавления: 2015-12-20; просмотров: 16; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!