【问题标题】:Weird issue with fstreamfstream 的奇怪问题
【发布时间】:2013-12-25 11:35:37
【问题描述】:

我想使用 fstream 在我的文本文件的特定行中转到特定字符。

例如,我想去第 2 行,我这样做:

stream.ignore(20, '\n'); // because i have 20 characters in each line.

它工作正常,但是当我尝试在这一行移动时:

stream.seekg(1, ios::cur); // move 1 char from the current position.

然后我测试输出:

char test;
stream >> test;

它在第 3 行中间给了我一个字符! (我应该在第 2 行)

然后我检查了我当前的位置是否正常:

stream.seekg(0, ios::cur);
stream >> char;

没关系,它在第 2 行的开头给了我字符。但是正如你所见,当我将 0 替换为 1 时,它在第 3 行的中间给了我一个字符! :/ 不应该移动 1 个字符吗?

你知道为什么会这样吗?

我正在制作一个基于图块的等距引擎,我需要在文本文件中保存和读取我的数据库。我正在保存/阅读的地图区域需要在我的视野中,所以我必须从 minx char 读取到 maxx char,并将 miny(line) char 读取到 maxy(line)。

谢谢

【问题讨论】:

  • 您可以添加您的文本文件或从中摘录吗?
  • 这是我用来测试的文本文件:pastebin.com/Lpm0DUnN
  • 您确定这不是签名/未签名问题吗?尝试使用无符号字符。编辑(看到你的文本文件):好吧,没关系。
  • 刚刚用 unsigned char 测试过,没用。
  • 我刚刚对此进行了测试,它工作正常。在移至下一行之前,请使用 stream.tellg() 查看当前位置。由于您从 ios::cur 移动,并且如果您的 getpointer 未设置在文件的开头,那么您将不会移动到下一行的开头。

标签: c++ fstream


【解决方案1】:

此处的链接:http://www.daniweb.com/software-development/cpp/threads/110602/problem-with-seekg 指出必须以二进制模式打开文件,以便 seekg 使用偏移量可靠地运行。试试看。

【讨论】:

  • 这可能是问题所在,我仍然不明白为什么它可以在我的计算机上运行。以二进制打开文件:stream("data.txt", ios::binary);
  • 当我尝试使用二进制时,if(stream) 条件为假,因为我的输出为空。当我没有条件时,我的输出现在是 -1,移动到 -1,让你从 -1
  • 您使用的是什么操作系统和编译器?
  • @user3134405 你的输出是空的是什么意思? fstream data("data.txt", ios_base::in|ios_base::binary);不适合你?
  • fstream data("data.txt", ios_base::in|ios_base::binary); ,我认为它有效!现在是 0,移动到 20,从 23 得到 b
【解决方案2】:

试试这个:

cout<<"Now at "<<stream.tellg()<<endl;

stream.ignore(20,'\n');

cout<<"Moved to "<<stream.tellg()<<endl;

stream.seekg(1, ios::cur);

char test;
stream>>test;
cout<<"Got character "<<test<<" from position "<<stream.tellg()<<endl;

【讨论】:

  • 输出是:现在在 0,移动到 45,从位置 72 得到字符 a。
  • 我删除并再次创建了我的文件,现在我有了这个:现在在 0,移动到 39,从位置 59
  • @user3134405 尝试将 '\n' 替换为 13,看看会发生什么。
  • 抱歉:现在是 0,从 60 移到 40。用 '/n' 替换为 13,我有 0、39、a 从 59。
  • 你能贴出你声明stream时开始的代码吗?
猜你喜欢
  • 2015-02-27
  • 2018-06-26
  • 2011-08-13
  • 2011-08-17
  • 2011-02-02
  • 2021-10-10
  • 2014-04-21
  • 2010-12-30
  • 2014-03-21
相关资源
最近更新 更多