C ++流得到unget而不是nop?

时间:2011-10-25 18:21:02

标签: c++ io

我有以下C ++程序并在Windows 7上使用Visual Studio 2008运行它。我得到然后取消一个字符。这样做后,文件位置不同。为什么?我该如何解决这个问题?


test.txt(如果需要,可以在下面下载链接)

/* Comment 1 */

/* Comment 2 */

#include <fstream>

int main (int argc, char ** argv) {
    char const * file = "test.txt";
    std::fstream fs(file, std::ios::in);
    std::streampos const before = fs.tellg();

    // replacing the following two lines with
    // char c = fs.peek(); results in the same problem
    char const c = fs.get();
    fs.unget();

    std::streampos const after = fs.tellg();
    fs.seekg(after);
    char const c2 = fs.get();
    fs.close();
    return 0;
}

  • c: 47 '/' char
  • c2: -1 'ÿ' char
  • before: {_Myoff=0 _Fpos=0 _Mystate=0 } std::fpos<int>
  • after: {_Myoff=0 _Fpos=-3 _Mystate=0 } std::fpos<int>

| std::fstream::binary添加到构造函数似乎可以解决问题。也许它与文件中的换行符有关?如果是这样,为什么它会影响甚至不接近读取换行符的代码?

更新了寻找后位置并获得另一个角色。

似乎通过Notepad与Vim保存有所不同。通过记事本保存使流工作正常。

我已将文件上传到谷歌文档,如果你想要它:

https://docs.google.com/leaf?id=0B8Ufd7Rk6dvHZmYyZjgwYmItMTI3MC00MDljLWJjYTctMWMxYWM0ODk1MTE2&hl=en_US

2 个答案:

答案 0 :(得分:2)

确定使用输入文件我看到你做的相同行为。经过一些实验,它看起来像是Unix格式的文件,然后编辑了^ M个字符(至少我能够重现它)。

要修复它,我在Vim中编辑了文件,执行了“:set ff = dos”,然后添加并删除了一个字符来弄脏文件,然后将其保存。

答案 1 :(得分:0)

文件位置按预期运行:

// unget.cpp
#include <fstream>
#include <iostream>
int main ()
{
    char const * file = "test.txt";
    std::fstream fs(file, std::fstream::in);

    std::cout << fs.tellg() << std::endl; // 0
    char c = fs.get();
    std::cout << fs.tellg() << std::endl; // 1
    fs.unget();
    std::cout << fs.tellg() << std::endl; // 0

    fs.close();
    return 0;
}

构建并运行:

$ clang++ unget.cpp 
$ ./a.out 
0
1
0

或者,我不明白问题出在哪里。