EOF突然在ifstream中使用getline()

时间:2014-02-24 13:53:49

标签: c++

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

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个下一个符号,第三个符号,我想要读取的内容,getline()自动赋值'\ 0'(如果我理解正确的话)。

2。)以下是​​问题 - 这里是输出符号(代码为[-52])。不幸的是,我没有足够的声望发布图像=((这个符号就像2条垂直的白线,这一对的右线在中间有间隙)。 (有关信息:我每次都有这个符号,我正在尝试读取char变量char数组的未初始化元素。) 但为什么我会在那里?因为第一个字符串中仍然存在未经重复的符号。整个第二串!

3。)事实证明,光标突然移动到文件末尾。但为什么??我无法理解

4。)我们在这里仍然为零,因为(如果我理解正确的话)没有尝试在eof-line后面读取数据。光标刚刚移动到文件的最后一个符号后面,但不在文件结束边框之外。

1 个答案:

答案 0 :(得分:1)

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

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