Информатика: Методические указания к лабораторным работам № 1-5. Функции. Обработка символьных данных. Организация работы с файлами, страница 29

 ostream_iterator< double >it(outfile," ");

 copy(v.begin(),v.end(),it);// Выводвекторавфайл

Определение конца файла и проверка корректности чтения из файла

Обычной файловой операцией в программах стало чтение содержимого файла, пока не встретится конец файла. Для проверки корректности чтения из файла нужно использовать функцию  fail.  Она возвращает значение  false,  если чтение из файла данной единицы (символа, слова, строки) произведено успешно, и true, если имеет место какая-то ошибка либо достигнут конец файла. Используя цикл while, можно непрерывно читать содержимое файла, пока не найдется конец файла или не встретится другая ошибка, как показано ниже:

while(!infile.fail()) { /* Чтение из файла */ }

Чаще всего, как показано далее в примерах, функцию  fail  используют неявно:

while(infile) { /* Чтение из файла */ }// infile – это !infile.fail()

Часто для определения конца файла используют и функцию eof. Эта функция возвращает значение false, если конец файла еще не встретился, и true, если встретился конец файла.

В примере 4 программа построчно читает содержимое файла test.txt, пока не достигнет конца файла или не встретит иной ошибки, в случае чего выдается соответствующее сообщение.

Пример 4

ifstream infile("test.txt");

string line;

while(getline(infile, line)) // Пока функция получения строки

// возвращает true(успех)

cout << line << endl; // Выводим эту строку на экран

if(!infile.eof()) // Если выход из цикла произошел не из-за конца файла..

            // …выводим соответствующее сообщение

runtime_error("Некорректные данные в файле test.txt");

Функция runtime_error(«Текст ошибки») инициирует ошибку во время выполнения программы с соответствующим текстом для пользователя в виде, как правило, всплывающего окна сообщений о критической ошибке. После закрытия такого окна программа досрочно прерывает свое дальнейшее выполнение.

Аналогично, в примере 5 программа читает содержимое файла по одному слову, пока не встретится конец файла.

Пример 5

ifstream infile("test.txt");

stringword;

while(infile >> word) // Пока чтение строки проходит успешно

cout << word << endl;

if (!infile.eof())

            runtime_error("Некорректные данные в файле test.txt");

И наконец, в примере 6 программа читает содержимое файла по одному символу за один раз, используя функцию get (как в примере 3), пока не встретит конец файла.

Пример 6

ifstream infile("test.txt");

char letter = infile.get();

while (infile) // infile – это !infile.fail()

{         cout << letter;

            letter = infile.get();

}

if (!infile.eof())

            runtime_error("Некорректные данные в файле test.txt");

Выполнение операций чтения и записи массивов и структур

Чтобы читать и писать массивы и структуры, можно использовать функции read и write. При использовании функций read и write вы должны указать буфер данных, в который данные будут читаться или из которого они будут записываться, а также длину буфера в байтах, как показано ниже:

infile.read(buffer,sizeof(buffer));

outfile.write(buffer, sizeof(buffer));

В примере 7 функция  write  используется для вывода содержимого структуры  worker  в файл  file.txt,  а функция  read  служит для чтения информации из файла о служащем и ввода ее в структуру  worker1

Пример 7

#include <iostream>

 #include <fstream>

 using namespace std;

 void main(void)

{ setlocale(LC_ALL,"rus_rus.1251");

struct St

{ string name;

int age;

double salary;

} worker = { "Иванов Владимир",33,25000.0 },worker1;

ofstream outfile("file.txt") ;

outfile.write((char *) &worker, sizeof(St));// Записьвфайл

outfile.close();

ifstream infile("file.txt");

infile.read((char *) &worker1, sizeof(St)); //Чтение из файла

cout << worker1.name << endl;

cout << worker1.age << endl;