繁体   English   中英

fstream get方法的行为不一致

[英]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

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

文件本身使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM