fstream get方法不一致

时间:2012-04-01 18:17:20

标签: c++ fstream

我正在尝试一次读取一个字符的文件,但由于某种原因,没有正确报告获取指针的位置:

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

string之间的空格是有意的。)

使用Notepad ++将文件本身保存在ANSI中。 我正在使用Visual Studio 2010 Ultimate SP1。

1 个答案:

答案 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()吗?