我在Visual Studio 2015中使用iostream进行了一些基本的文件操作,并注意到这种奇怪的行为。
#include <fstream>
#include <iostream>
#include <sstream>
void main(int argc, char** argv)
{
std::wifstream stream("example.txt");
//std::ifstream stream("example.txt");
//std::wstringstream stream(L"abcdefghijklmnopqrstuvxyz");
std::wcout << (char)stream.peek() << "\n"; // a
stream.tellg();
std::wcout << (char)stream.peek() << "\n"; // b
stream.tellg();
std::wcout << (char)stream.peek() << "\n"; // c
stream.tellg();
std::wcout << (char)stream.peek() << "\n"; // d
stream.tellg();
std::wcout << (char)stream.peek() << "\n"; // e
stream.tellg();
std::wcout << (char)stream.peek() << "\n"; // f
stream.tellg();
std::wcout << (char)stream.peek() << "\n"; // g
stream.tellg();
}
example.txt包含:
abcdefghijklmnopqrstuvxyz
看来
stream.tellg()
使流的当前字符前进一个。仅对于std::wifstream
会发生这种情况。 std::ifstream
和std::wstringstream
似乎不受影响。这是Visual Studio STL实施中的错误吗?
最佳答案
此问题与wifstream/wfstream implementation bug in Visual C++ 2010类似。
正如斯蒂芬所说:
C ++标准在调用tellg()时不提供行为保证
在以文本模式打开的文件上。
我想这就是原因。