Где я должен использовать класс iostream? - PullRequest
3 голосов
/ 29 декабря 2010

Как мы знаем в C ++, у нас есть класс iostream, который наследуется от istream (basic_istream) и ostream (basic_ostream). В каждой книге C ++ вы можете найти, что с объектом класса iostream вы можете читать и записывать в один и тот же поток. Но я действительно не вижу никакого объяснения или примера, чтобы понять, почему я должен использовать такую ​​странную мысль. Я действительно не знаю, зачем мне писать в какой-то поток, а потом читать из него :(.

Не могли бы вы объяснить, когда мне понадобится такая конструкция? Я думаю, что должна быть серьезная причина для использования такой конструкции (не забывайте, что только для объявления iostream мы используем виртуальное наследование и множественное наследование).

Также, когда я пытаюсь написать простой код, который использует fsteram (производный от iostream), я обнаруживаю, что он работает не так, как я ожидаю. Вот мой код:

#include <fstream>
using namespace std;
int  main()
{
    fstream fstr("somefile.txt",fstream::in|fstream::out);//fstream is deriveted from iosteram
    int n;
    fstr>>n;//reading n (WORKS FINE !!!).

    fstr.flush();

    //trying to print Hello to the same file
    fstr<<"Hello"<<endl;// NOT WORKING!!!!!!!

    fstr.flush();

    return 0;
}

Можете ли вы сказать мне, почему этот код может читать из файла и не может что-то записать в него ????

Резюме: Скажите, пожалуйста, для чего нам нужен класс iosteram и почему isteram и ostream не достаточно и как его использовать.

Спасибо и извините за мой английский:).

P.S. Возможно, этот вопрос является примитивным, но, пожалуйста, ответьте мне.

Редактировать: мой код сейчас работает. Спасибо Мурке.

Ответы [ 4 ]

4 голосов
/ 29 декабря 2010

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

#include <fstream>
using namespace std;
int  main()
{
    fstream fstr("somefile.txt",fstream::in|fstream::out);//fstream is deriveted from iosteram
    int n;
    fstr>>n;//reading n (WORKS FINE !!!).

    fstr.clear();     //Clear any errors, eof, etc.
    fstr.seekg(0, ios::beg);  //Seek to beginning of file
    fstr.flush();

    //trying to print Hello to the same file
    fstr<<"Hello"<<endl;// NOW WORKS!!!

    fstr.flush();

    return 0;
}
2 голосов
/ 29 декабря 2010

зачем мне нужна возможность одновременно читать и писать в файл?

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

1 голос
/ 29 декабря 2010

Возможно, вы захотите читать и записывать в один и тот же поток, потому что поток выполняет преобразования типов, такие как std :: stringstream. Вы также можете иметь абстракции iostream над источниками данных, которые разрешают как чтение, так и запись, например сокет или буфер в памяти.

0 голосов
/ 29 декабря 2010

когда мне понадобится такая конструкция

Редко. Смотрите мой ответ здесь: https://stackoverflow.com/questions/4517299/is-fstream-better-than-iostream-in-c/4517883#4517883

Отредактировано: Если вы не думаете, что вам это нужно, вам это не нужно.

...