Меню
Главная
Авторизация/Регистрация
 
Главная arrow Информатика arrow Программирование на языке высокого уровня. Программирование на языке С++

Примеры программ работы с файлами

При работе с текстовыми файлами наиболее часто встречаются четыре действия:

  • • посимвольное чтение;
  • • посимвольная запись;
  • • построчное чтение;
  • • построчная запись.

Рассмотрим эти действия на примерах.

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

#include //подключение библиотеки файловых потоков

#include //подключение потоковой библиотеки

ввода-вывода

using namespace std; //указание на использование пространства имен std

int main()

{

if stream inputFile; //создание входного файлового потока

char name[32];

cout << "Enter file name: ";

//вывод приглашения к вводу имени файла с in >> name; //ввод имени файла с клавиатуры

inputFile.open(name, ios::in);

//попытка открыть файл на чтение

if (!inputFile)

//если экземпляр входного файлового потока равен пустому значению NULL

{

cout << "Error open file!" << endl;

//вывод сообщения об ошибке return 1; //выход из функции main

}

char с, next; /*'объявление символьных переменных с — очередного

символа, next — следующего символа*/ int count = 0; //объявление и инициализация числа символов в файле whi 1 е (1) //цикл со всегда истинным условием

{

і при t F і 1 е. ge t (с) ; //чтение очередного символа из файла

next = inputFile.peek();

//попытка чтения следующего символа из файла

if (next == EOF)

//если следующий символ находится за концом файла

{

cout << с; count++; break;

}

cout << c; count++;

//вывести на экран последний символ файла //увеличить на 1 число символов в файле

//выйти из цикла

//вывести на экран очередной символ файла //увеличить на 1 число символов в файле

}

cout << endl; //перевод курсора на начало следующей строки экрана inputFile .close () ; //закрыть доступ к файлу

cout << "Count = " << count << endl;

//вывод числа символов в файле

return 0;

}

Результат работы программы:

Enter file name: input.txt

1 2 3 4 //после 4 в файле нет пробелов и нажат enter

abed //в конце этой строки тоже нет пробелов и enter не нажат Count = 15 //в файле 15 символов

Для продолжения нажмите любую клавишу . . .

Пояснение. Для посимвольного чтения файла в бесконечном цикле (while (1)) используется ранее применяемый метод get (). В цикле происходит постоянная проверка следующего за текущим (очередным) символа: next = inputFile .peek () ;. Как только доходим до символа «конец файла» (EOF), то происходит выход из цикла с помощью оператора break.

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

#include //подключение библиотеки файловых потоков

#include / /подключение потоковой библиотеки

Цввода-вывода

using namespace std; //указание на использование пространства имен std

int main()

{

of stream outputFile; //создание выходного файлового потока

char name[32];

cout << "Enter file name:

//вывод приглашения к вводу имени файла с in >> name; //ввод с клавиатуры имени файла

outputFile.open(name, ios::out);

//попытка открыть файл на запись

if (!outputFile)

//если экземпляр выходного файлового потока равен пустому значению NULL

{

cout << "Error open return 1;

file!" << endl;

//вывод на экран сообщения об ошибке //выход из функции main

}

char с; //объявление символьной переменной с

for (int i = 0; i<26; i++)

//в цикле для всех букв латинского алфавита

{

с = ' А' + i; /*любая латинская буква получается суммой

латинской буквы Л' и номера в латинском алфавите заданной буквы*/ outputFile . put (с) ; //запись в файл символа с

outputFile. put ( ' ' ) ; //запись в файл пробела

}

outputFile. close () ; //закрыть доступ к файлу

return 0;

}

В результате работы программы в файл будет записана строчка:

ABCDEFGHIJKLMNOPQRSTUVWXYZ

Пояснение. После считывания имени файла с клавиатуры с помощью метода Open файл открывается на запись. Запись букв английского алфавита происходит в цикле for. Счетчик цикла меняет свое значение от 0 до 25 включительно. Для последовательного получения символов алфавита к счетчику цикла прибавляется символ ' А' Для записи символа в файл используется метод put () . После окончания работы с файлом необходимо закрыть поток, используя метод close.

Пример 3. С клавиатуры ввести имя файла. Вывести его содержимое на экран, подсчитать количество строк в файле.

#include //подключение библиотеки потоков f stream ttinclude //подключение потоковой библиотеки

//ввода-вывода

using namespace std; //указание на использование пространства

//имен std

int main()

{

if stream inputFile; //создание входного файлового потока

char name[32];

cout << "Enter file name:

//вывод приглашения к вводу имени файла cin >> name; //ввод с клавиатуры имени файла

inputFile.open(name, ios::in);

//попытка открыть файл на чтение

if (!inputFile)

//если экземпляр входного файлового потока равен пустому значению NULL

{

cout << "Error open file!" << endl;

//вывод сообщения об ошибке return; //выход из функции main

}

char str[256], next;

//описание строки, считываемой из файла, и следующего символа файла

int count = 0;

//объявление и задание начального значения числу строк в файле while (1) //цикл со всегда истинным условием

{

inputFile.getline(str, 256);

//чтение очередной (текущей) строки из файла next = inputFile.peek();

//попытка чтения следующего символа

if (next == EOF)

//если следующий символ находится за концом файла

{

cout << str << endl; /*вывести на экран последнюю

строку файла и перевести курсор на начало следующей строки экрана*/ count+ +; //увеличить на I число строк файла

break; //выход из цикла

}

count+ +; //увеличить на 1 число строк файла

cout << str << endl; /^вывести на экран очередную

(текущую) строку файла и перевести курсор на начало следующей строки экрана*/

}

cout << "Count = " << count << endl;

//вывести на экран количество строк в файле inputFile. close () ; //закрыть доступ к файлу

return 0;

}

Результат работы программы:

Enter file name: input.txt

12 3 4

abed

5 6 7 8 9

e f g h g

Count - 4

Для продолжения нажмите любую клавишу . . .

Пояснение. Построковое чтение файла практически идентично посимвольному чтению. Только вместо метода get () используется метод get line () . При этом нужно не забывать, что этот метод читает строку до символа новой строки ' п', не включая его.

Пример 4. Демонстрация построковой записи информации в файл.

#include

#include using namespace std; int main()

{

ofstream outputFile;

outputFile.open("str.txt", ios::out); if (!outputFile)

{

cout << "Error open file!" << endl; return;

<<"Я не знаю, где встретитьсяп";

outputFile

outputFile

outputFile

outputFile

outputFile

//записать в выходной файл первую строку <<"Нам придется с тобой,п";

//записать в выходной файл вторую строку <<"Глобус крутится-вертится,п";

//записать в выходной файл третью строку <<"Словно шар голубойп";

//записать в выходной файл четвертую строку close () ; //закрыть доступ к файлу

}

Пояснение. Для записи в файл строки пользуемся операцией вставки в поток «<<». Записываемые строки являются строками типа *с!іаг, завершающимися символом ' п '.

Признак конца файла

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

Признак конца файла анализируется в выражении вида

while (! inputFile.eof())

{ . . . }

где . eof () - EndOfFile — метод проверки на конец файла.

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

Для проверки как конца файла, так и наличия ошибок при его чтении можно воспользоваться методом good ():

while (inputFile.good())

{ . . . }

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

Пример 5. С клавиатуры ввести имя текстового файла, создать файл с именем copy.txt записать в него копию исходного файла.

#include //подключение библиотеки файловых потоков

#include //подключение потоковой библиотеки

Цввода-вывода

#include

using namespace std; //указание на использование пространства имен std

int main()

{

if stream inputFile; //исходный файл

ofstream outputFile; //файл-копия

char name[32]; cout << "Enter file name:

//вывод приглашения к вводу имени файла с in >> name; //ввод имени файла с клавиатуры

inputFile.open(name, ios::in);

//попытка открыть файл на чтение

if (!inputFile)

//если экземпляр входного файлового потока равен пустому значению NULL

{

cout << "Error open file!" << endl ;

//вывод сообщения об ошибке return 0; //выход из функции main

}

outputFile.open("copy.txt", ios::out); if (!outputFile)

//если экземпляр входного файлового потока равен пустому значению NULL

{

cout << "Error open file!" << endl ;

//вывод сообщения об ошибке return 0; //выход из функции main

}

char str[256];

while(inputFile.good())

//выполняем цикл до тех пор, пока с файлом все хорошо

{

inputFile.getline(str, 256);

//читаем строку из исходного файла outputFile << str << endl; //и пишем ее в файл-копию

}

cout << endl; //перевод курсора на начало следующей строки экрана inputFile .close () ; //закрыть доступ к файлу

outputFile.close(); return 0;

}

Пояснение. Исходный файл открывается для чтения (флаг ios: : in), а файл, в который будет копироваться информация, — на запись. Оба файла проверяются на корректное открытие. Чтение данных осуществляется в цикле while с условием inputFile . good (). Использование этого метода позволяет не только отследить достижение конца файла, но и проверить его целостность.

Чтение и запись в файл стандартных типов данных

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

int х;

разделенные пробелами, то можем считать их следующим образом:

inputFile >> х;

Пример 6. Дан числовой файл inp.txt. Выбрать все значения, которые делятся нацело на 2 и 4, но не делятся на 6. Записать эти значения в файл outl.txt, а все остальные — в файл out2.txt.

#include ttinclude

#include

#include using namespace std; int main()

{

int x;

ifstream in_f ile (" inp. txt", ios::in); /* создание входного потока in_f i le и попытка связать его с файлом inp. txt, открытым

на чтение*/

if (!in_file)

//если экземпляр входного файлового потока равен пустому значению NULL

{

cout<<"Error input file"<

//вывод сообщения об ошибке во входном файле exit (1) ; //выход из программы

}

of stream out_f ilel ("outl. txt" , ios::out); /*создание

выходного потока out_f ilel и попытка связать его с файлом outl. txt, открытым на запись*/ if (! out_f ilel) /*если экземпляр 1-го выходного файлового потока

равен пустому значению NULL*/

{

cout<<"Error output filel"<

//вывод сообщения об ошибке в 1-м выходном файле exit (1) ; //выход из программы

}

ofstream out_file2("out2.txt", ios::out); ofstream out_f ilel (" outl. txt" , ios : : out) ; /*создание выходного потока out_f ile2 и попытка связать его с файлом out2 . txt, открытым

на запись*/

if ( ! out_f i 1е2 ) /*еслиэкземпляр 1-го выходного файлового

потока равен пустому значению NULL*/

{

cout<<"Error output file2"<

//вывод сообщения об ошибке в 1-м выходном файле

exit (1) ; //выход из программы

)

while (in_file) //пока из файла можно что-то считать

{

in_file >> х; //считать из файла целое число

if ( х%2 == 0 && х%4 == 0 && х%6 != О )

/*если остаток от деления к на 2 и на 4 равен О, но остаток от деления у, на 6 не равен О*/ out_filel << х << " //записать х в outf ilel

else

out_file2 << x << " ";

//иначе записать x в out f ilel

}

in_file.close() ;

outfilei.close(); outfile2.close(); return 0;

}

Чтение и запись в файл пользовательских типов данных

Так как классы ifstream, ofstream и fstream являются производными соответственно от классов istream, ostream и stream, то по умолчанию при использовании следующего кода:

Anketa al - {"Sidorov", 30}; ofstream outF("info.txt", ios::out); outF << al;

компилятор выдаст ошибку. Решить эту проблему можно путем перегрузки операций «<<» и «>>»:

ofstream& operator << (ofstream& outF, Anketa& a)

{

outF << a.name << ", " << a.age << endl; return outF;

}

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

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

#include

#include using namespace std;

struct Abonent //начало определения структурного типа Abonent {

char surname [32] ; //'определение поля surname — фамилия

char street [32 ] ; //определение поля street — название улицы

int numberHouse; int year;

};

//запись структуры в файл (в программе не используется)

ofstream& operator << (ofstream& outF, Abonent& a)

/*перегрузка операции вставки в файловый поток для данного типа Abonent; outF — ссылка на объект класса поток of stream V

{

outF << a.surname << ", " << a.street << ", " <<

а . numberHouse << ", " << a. year << endl; /* оператор вставки в поток outF значений а. simame(muna строка), а. street (типа строка ), а. numberHouse (int) и a. a. year (типа int)*/

return outF;

//возврат ссылки на файловый поток outF после вставки

11необходимых значений

}

//вывод структуры на экран ostream& operator « (ostream& out, Abonent& a) /* перегрузка

операции вставки в поток для данного типа Abonent ; out — ссылка на объект класса поток os t г earn*/

{

out << а.surname << ", " << a.street << ", " << а. numberHouse << ", " << a.year << endl; /^оператор вставки

в поток out значений а. surname(muna строка), а. street (типа строка), а. numberHouse (int) и a .year (типа int)*/ return out;

//возврат ссылки на поток out после вставки необходимых значений

}

//чтение структуры из файла

ifstream& operator >> (ifstream& inpF, Abonent& a)

/*перегрузка операции изъятия из файлового потока для данного типа Abonent ; inpf — ссылка на объект класса файловый поток

ifstreamV

{

inpF >> а.surname >> a.street >> а.numberHouse >> а . year; /*оператор изъятие из файлового потока inpf значений

а. surname (типа строка), а. street (типа строка ), а. numberHouse (int) и a .year (типа int)*/ return inpF; /*возврат ссылки на файловый поток inpF после

изъятия необходимых значений*/

}

int main()

{

Abonent ab; //объявление структуры ab типа Abonent

ifstream inpF (" info. txt", ios::in); /* создание входного

потока inpF и попытка связать его с файлом info. txt, открытым на чтение*/

char с, next; /* объявление переменных с — очередной (текущий)

символ и next — следующий символ потока*/

int count = 0;

//объявление и инициализация числа абонентов в файле cout << "Enter simbol: //вывод приглашения к вводу символа

cin>>c; //ввод символа с клавиатуры

while (1) //в цикле со всегда истинным условием продолжения

{ inpF >> ab; //чтение из файла сведении об абоненте

next = inpF.peek();

//попытка чтения следующего символа из файла if (ab.surname[0] == с)

//если первая буква фамилии абонента совпадает с заданным символом { cout << ab; //вывести на экран сведения об абоненте

count + +; /*увеличить на 1 число абонентов с фамилией

на заданный символ */

}

if (next == EOF)

//если следующий символ находится за концом файла break; //выход из цикла

}

if (count == 0)

cout << "Abonentov net!" << endl; return 0;

}

 
Если Вы заметили ошибку в тексте выделите слово и нажмите Shift + Enter
< Пред   СОДЕРЖАНИЕ   След >
 

Популярные страницы