Как-то одним пасмурным вечером я вспоминал 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


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

Ни единого вам бага в коде!