Как-то одним пасмурным вечером я вспоминал C++. Прошло почти 2 года, как я к нему не притрагивался. Мне дали тестовое задание для проверки моих знаний, о котором я не буду говорить, т.к. оно слишком простое и я напряженно просматривал MSDN. Руки отказывались вспоминать, но мозг сказал: «Назад дороги нет!».
Прошло какое-то время, задание было готово. Я даже отладил его, я так думал. Внезапно, словно осенило, я решил протестировать его на производительность. Я набираю большой тестовый текст, запускаю приложение и вижу совсем не тот результат, какой должен быть. Далее я теряю ещё час в отладчике. В результате не верю своим глазам. Длина файла не совпадает с количеством символов. Функция ftell возвращает одно значение, а результат прохождения другое. Я начинаю переставать понимать, что происходит.
Вот он зловещий кусок кода, набранный в IDE Visual Studio Express 2012:
Вот первый вывод в консоль (ни что не предвещало беды):
Вот второй вывод в консоль (тут я стал сомневаться):
Вот третий вывод в консоль (теперь я понял, что что-то не понял):
Пытливый и опытный читатель наверно нашёл разгадку?
Я лично нет, надеюсь увидеть ответ в ваших комментариях и способ обхода(исправления) этой особенности разрывающей мой мозг на клочки.
Ни единого вам бага в коде!
Прошло какое-то время, задание было готово. Я даже отладил его, я так думал. Внезапно, словно осенило, я решил протестировать его на производительность. Я набираю большой тестовый текст, запускаю приложение и вижу совсем не тот результат, какой должен быть. Далее я теряю ещё час в отладчике. В результате не верю своим глазам. Длина файла не совпадает с количеством символов. Функция 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
Пытливый и опытный читатель наверно нашёл разгадку?
Я лично нет, надеюсь увидеть ответ в ваших комментариях и способ обхода(исправления) этой особенности разрывающей мой мозг на клочки.
Ни единого вам бага в коде!