[英]fstream get method not behaving consistently
我正在尝试一次读取一个字符的文件,但是由于某种原因,没有正确报告get指针的位置:
std::wifstream stream(L"tokenizer.txt");
int pos = static_cast<int> (stream.tellg());
stream.get();
stream.get();
pos = static_cast<int> (stream.tellg());
stream.close();
两次调用stream.get之前的pos值应为0,但应为0。 奇怪的是,任何在第一个之后的调用都将影响stream.tellg的结果。 换句话说,第一次调用get不会导致tellg的结果发生变化。
如果在第一个调用get之后调用unget,它仍然报告该位置为0,但会将其视为在位置1,因为接下来的2个字符为'/'和'c',而它们应为'/ ''/'。
该文件的内容如下:
//comment
123.45 100 "delimited string" str ing
( str
和ing
之间的空格是有意的。)
文件本身使用Notepad ++保存在ANSI中。 我正在使用Visual Studio 2010 Ultimate SP1。
在Mac OS X 10.7.3上使用G ++ 4.7.0进行编译(这是一个“自建”的编译器)时,紧随您的轮廓派生的以下代码将产生输出:
pos = 0
c = 47
c = 47
pos = 2
这就是您所期望的。
编译命令行:
g++ -O3 -g -Wall -Wextra xx.cpp -o xx
实际代码:
#include <iostream>
#include <fstream>
int main(void)
{
std::wifstream stream("tokenizer.txt");
int pos = static_cast<int> (stream.tellg());
std::cout << "pos = " << pos << std::endl;
int c = stream.get();
std::cout << "c = " << c << std::endl;
c = stream.get();
std::cout << "c = " << c << std::endl;
pos = static_cast<int> (stream.tellg());
std::cout << "pos = " << pos << std::endl;
stream.close();
}
除了添加诊断打印,标头和main()
函数外,唯一的显着区别是std::wifstream
没有构造函数接受wchar_t
数组,因此我删除了L
这表明您要链接的库或使用的编译器都有些奇怪。 是否可以优化对get()
的两个调用之一? 您确定在两次get()
调用之一之前的行中没有//...comment ending in backslash\\
的//...comment ending in backslash\\
吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.