我有以下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保存有所不同。通过记事本保存使流工作正常。
我已将文件上传到谷歌文档,如果你想要它:
答案 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
或者,我不明白问题出在哪里。