Язык программирования C++. Вводный курс


Файловый ввод/вывод - часть 7


// запомнить текущую позицию

ios_base::pos_type mark = inOut.tellg();

inOut << cnt << sp;

inOut.seekg( mark );   // восстановить позицию

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

Дело в том, что inOut

находится в состоянии “конец файла”, в котором операции ввода и вывода не выполняются. Для решения проблемы необходимо сбросить это состояние с помощью функции-члена clear():

inOut.clear();   // обнулить флаги состояния

Окончательный вариант программы выглядит так:

#include <iostream>

#include <fstream>

 

int main()

{

    fstream inOut( "copy.out", ios_base::in|ios_base::app );

    int cnt=0;

    char ch;

 

    inOut.seekg(0);

 

    while ( inOut.get( ch ))

    {

        cout.put( ch );

        cnt++;

 

        if ( ch == '\n' )

        {

            // запомнить текущую позицию

            ios_base::pos_type mark = inOut.tellg();

            inOut << cnt << ' ';

            inOut.seekg( mark ); // восстановить позицию

        }

    }

    inOut.clear();

    inOut << cnt << endl;

 

    cout << "[ " << cnt << " ]\n";

 

    return 0;

}

Вот теперь – наконец-то! – все правильно. При реализации этой программы было необходимо явно сформулировать поведение, которое мы собирались поддержать. А каждое наше исправление было реакцией на выявившуюся ошибку вместо анализа проблемы в целом.

Упражнение 20.12

Пользуясь операторами вывода для класса Date, которые вы определили в упражнении 20.7, или для класса CheckoutRecord из упражнения 20.8 (см. раздел 20.4), напишите программу, позволяющую создать файл и писать в него.

Упражнение 20.13

Напишите программу для открытия и чтения файла, созданного в упражнении 20.12. Выведите содержимое файла на стандартный вывод.

Упражнение 20.14

Напишите программу для открытия файла, созданного в упражнении 20.12, для чтения и дозаписи. Выведите экземпляр класса Date или CheckoutRecord:

(a) в начало файла

(b) после второго из существующих объектов

(c) в конец файла




Начало  Назад  Вперед