我在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::ifstreamstd::wstringstream似乎不受影响。

这是Visual Studio STL实施中的错误吗?

最佳答案

此问题与wifstream/wfstream implementation bug in Visual C++ 2010类似。

正如斯蒂芬所说:


  C ++标准在调用tellg()时不提供行为保证
  在以文本模式打开的文件上。


我想这就是原因。

07-25 20:41