tellg перемещается после операции записи в файл

#c #file-io

#c #file-io

Вопрос:

Почему tellg () перемещается после операции записи, я полагаю, это должен быть tellp ()?

 std::fstream fs("c:\log.txt", std::ios::in | std::ios::out | std::ios::trunc);
fs << "write";
std::cout << fs.tellg() << std::endl;
fs.close();
  

Вывод:

 5
  

Ответ №1:

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

Комментарии:

1. Почему? Это не происходит со мной в stringstream.

2. Ах, почему? Я нахожу вопросы, которые спрашивают, почему? здесь, чтобы быть довольно бесполезным. Языки программирования являются человеческими конструкциями и на самом деле могли быть определены бесконечным числом способов. Мы придерживаемся единственного способа, выбранного разработчиками.

3. @George Что на этой странице подтверждает ваше утверждение «нет, это не так»? Мои полномочия — Langer amp; Kreft — «Двунаправленные потоки файлов … поддерживают только один индикатор положения соединения».

4. Потому что указатель get поступает из istream, а указатель put — из ostream. Итак, как они могут быть одинаковыми?

5. @parc65 Потоки файлов и памяти реализованы по-разному. Потоки памяти имеют два указателя положения, в то время как файловые потоки имеют только один.