Search
Write a publication
Pull to refresh

Мания величия ftell или низкая самооценка fgetc?

Как-то одним пасмурным вечером я вспоминал C++. Прошло почти 2 года, как я к нему не притрагивался. Мне дали тестовое задание для проверки моих знаний, о котором я не буду говорить, т.к. оно слишком простое и я напряженно просматривал MSDN. Руки отказывались вспоминать, но мозг сказал: «Назад дороги нет!».
Прошло какое-то время, задание было готово. Я даже отладил его, я так думал. Внезапно, словно осенило, я решил протестировать его на производительность. Я набираю большой тестовый текст, запускаю приложение и вижу совсем не тот результат, какой должен быть. Далее я теряю ещё час в отладчике. В результате не верю своим глазам. Длина файла не совпадает с количеством символов. Функция ftell возвращает одно значение, а результат прохождения другое. Я начинаю переставать понимать, что происходит.
Вот он зловещий кусок кода, набранный в IDE Visual Studio Express 2012:
...
 printf( "The file 'c:\\z.txt' was opened\n" );
	  fseek (stream,0,SEEK_SET);
	  for (i=0; ch != EOF; i++)
		{
			ch=fgetc(stream); 
			if (ch == EOF) break;			
			std::cout<<ch;
		}
	  std::cout<<"\n"<<"i="<<i<<"\n";
	  std::cout<<"ftell="<<ftell(stream)<<"\n";
	  fseek (stream,0,SEEK_END);
	   std::cout<<"ftell="<<ftell(stream)<<"\n";
...


Вот первый вывод в консоль (ни что не предвещало беды):
The file 'c:\z.txt' was opened
12345
i=5
ftell=5
ftell=5

Вот второй вывод в консоль (тут я стал сомневаться):
The file 'c:\z.txt' was opened
12345
6
i=7
ftell=8
ftell=8

Вот третий вывод в консоль (теперь я понял, что что-то не понял):
The file 'c:\z.txt' was opened
12345
6
7
i=9
ftell=11
ftell=11


Пытливый и опытный читатель наверно нашёл разгадку?
Я лично нет, надеюсь увидеть ответ в ваших комментариях и способ обхода(исправления) этой особенности разрывающей мой мозг на клочки.

Ни единого вам бага в коде!
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.