Функции tellg () и tellp () при обработке файлов показывают непредвиденное поведение - PullRequest
0 голосов
/ 05 апреля 2020

Это мой код ниже.

Здесь вывод (Привет 5). Если я удаляю третью строку (используйте для), вывод (Привет 4). Технически результат должен быть (Hi 3), но tellg () увеличивается с каждым увеличением строки.

#include<bits/stdc++.h>
void main(){
fstream file("d.txt",ios::trunc | ios::in | ios::out);
string c;
file<<"Hi there"<<endl;
file<<"good evil"<<endl;
file<<"use to"<<endl;
file.seekg(0,ios::beg);
file>>c;
cout<<c<<" "<<file.tellg()<<endl;
}

1 Ответ

0 голосов
/ 07 апреля 2020

Стандарт на самом деле не гарантирует какого-либо определенного c значения для tellg, только если на его выходе через некоторое время запускается seekg, он помещает поток в то же место, где он был. В любом случае, вывод tellg определяется реализацией. Он даже не должен быть конвертируемым в целочисленный тип. С точки зрения реализаций, обычно файлы, открытые в двоичном режиме (и в текстовом режиме для систем * nix), будут выводить tellg, равный смещению байта от начала файла, в то время как в текстовом режиме (не * nix системах) производя некоторое значение, большее или равное смещению байта.

По определенной c причине, по которой tellg увеличивается на 1 каждый раз, когда вы добавляете строку, одним из возможных факторов, который мог повлиять на это поведение, определяемое реализацией в вашем компиляторе, может быть тот факт, что Windows терминатор строки \n\r составляет два байта вместо одного. Конечно, полагаться на поведение, определяемое реализацией, как правило, плохая идея.

Источник: { ссылка }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...