【问题标题】:EOF suddenly reaching with getline() in ifstreamEOF 突然到达 ifstream 中的 getline()
【发布时间】:2014-02-24 13:53:49
【问题描述】:

我有包含 2 个字符串的文件“in.txt”:

abcde
12345

我有我的代码:

#include <iostream>
#include <fstream>
int main() {
   std::ifstream fileIn("in.txt", std::ios::in);

   char* chPtr = new(char[10]);
   char ch;

   printf("fileIn.get()==EOF?: %d \n", (fileIn.get() == EOF));  // =0
   std::cout << "fileIn.eof() = " << fileIn.eof() << "\n";  // =0

   fileIn.getline(chPtr, 3);
   std::cout << "chPtr-" << chPtr << "\n";  //output:"bc" (see 1.)
   fileIn.get(ch);
   std::cout << "ch-" << ch << "\n";   //(see 2.)

   printf("fileIn.get()==EOF?: %d \n", (fileIn.get() == EOF));  // =1 (see 3.)
   std::cout << "fileIn.eof() = " << fileIn.eof() << "\n";  // =0 (see 4.)

   fileIn.close();
   delete[] chPtr;  
}

代码备注:

(1.) 第一个符号 'a' 被略高于 get() 吃掉了;因此这里读取了 2 个下一个符号,以及我想要读取的第 3 个符号,getline() 自动分配值 '\0'(如果我理解正确的话)。

(2.)这是问题 - 这里输出符号(代码 [-52])。不幸的是,我没有足够的声誉来发布图片 =((这个符号就像 2 条垂直的白线,这对的右线在中间有间隙)。 (供参考:我每次都得到这个符号,我试图将 char 数组的未初始化元素读取到 char 变量中。) 但为什么我得到它?因为第一个字符串和整个第二个字符串中仍有未读符号!

(3.) 原来,光标突然移动到文件末尾。但为什么??看不懂

(4.) 我们这里仍然为零,因为(如果我理解正确的话)没有尝试读取 eof 行后面的数据。光标只是移动到文件的最后一个符号后面,但没有超出文件结束边界)。

【问题讨论】:

  • 我完全不知道你在问什么。
  • 我问过(如果简洁的话),为什么在声明 fileIn.get(ch); 之后我没有得到 ch=='d',但是 ch== 字符代码为 -52 //i.e. (int)ch ==-52

标签: c++


【解决方案1】:

如果istream::getline 在到达EOF 之前设法读取count-1 字符(在您的示例中count 是3),它将设置failbit。请参阅reference

这意味着所有进一步的提取都将失败,除非您清除标志,而不是“光标移到末尾”。 ch 永远不会被初始化。

【讨论】:

  • 如果我正确理解了information,则设置了fialbit 标志,当:-(count-1) 字符为红色且未达到 EOF 或 delim,-下一个字符(count-1 之后)也不是delim。谢谢你的提示。我仍然不明白,为什么在设置失败位标志时检查 EOF 给我true,但我认为这是设置此标志的副作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-03
  • 2011-06-09
  • 1970-01-01
  • 2011-01-16
  • 2011-01-21
  • 2011-03-31
相关资源
最近更新 更多