gpt4 book ai didi

c++ - fstream get 方法的行为不一致

转载 作者:太空宇宙 更新时间:2023-11-04 12:10:45 30 4
gpt4 key购买 nike

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

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。奇怪的是,在第一个之后调用 get 都会影响 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();
}

除了添加诊断打印、 header 和 main() 函数外,唯一显着的区别是 std::wifstream 没有接受数组的构造函数wchar_t,所以我删除了 L

这表明您正在链接的库或您正在使用的编译器有些奇怪。是否可以优化对 get() 的两次调用之一?您确定在对 get() 的两次调用之一之前的行中没有以反斜杠结尾的 //...注释\ 吗?

关于c++ - fstream get 方法的行为不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9966946/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com