我正在尝试一次读取一个字符的文件,但由于某种原因,没有正确报告获取指针的位置:
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,应该是,但在它们之后只有1。奇怪的是,在第一次调用之后的任何调用都会影响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。
答案 0 :(得分:1)
在Mac OS X 10.7.3(这是一个'home built'编译器)上使用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()
的两次调用之一?在对//...comment ending in backslash\
的两次调用之一之前,您确定该行没有get()
吗?