如何使用ifstream读取文本文件时检查EOF

时间:2015-04-02 17:29:21

标签: c++ ifstream eof

我想使用ifstream在c ++中读取文本文件,以了解单词,字符和行的数量。

unsigned int wordNum = 0;
unsigned int lineNum = 0;
unsigned int charNum = 0;
char check;

ifstream in("example_2_4.txt");
char temp[30];

if (!in.is_open()) {
    cout << "File opening error!" << endl;
}

while (!in.eof()){
    in.getline(temp, 30);

    wordNum += countWord(temp);
    charNum += countChar(temp);
    lineNum++;

    in.clear();
}

问题是eof()不起作用,因为存在超过30个字符的行。

我已将!in.eof()更改为in>>check并且效果很好,但它会读取一个字符,因此我无法对所有字符进行计数。

我不应该使用string类,并且无法更改缓冲区大小。

有没有正确的方法来检查eof

4 个答案:

答案 0 :(得分:0)

我不完全确定你在问什么,但ifstream::getline() sets the failbit当它试图读取太长时间的字符串时。在您的情况下,永远不会设置eof位(即使您正在清除所有位)。

您可以这样做:

while (in)

除了没有清除任何标志。

如果您希望能够读取比您可以存储的缓冲区更长的行,则需要以其他方式读取文件,可能使用ifstream::get()代替。

答案 1 :(得分:0)

in.getline(temp, 30);返回istream&,因此将while循环移动到此处while(in.getline(temp, 30))会在到达文件末尾或读取错误时返回false。

答案 2 :(得分:0)

试试这个:

  string line;
  ifstream myfile ("example_2_4.txt");
  if (myfile.is_open())
  {
    while ( getline (myfile,line) )
    {
      cout << line << '\n';


    wordNum += countWord(line);
    charNum += countChar(line);
    lineNum++;
    }
    myfile.close();
  }

  else cout << "Unable to open file"; 

  return 0;

答案 3 :(得分:0)

鉴于你的限制,我建议:

  1. 逐个字符地阅读文件。
  2. 到达EOF时结束循环。
  3. 增加字符数。
  4. 检查字符是否标记单词的结尾。如果是这样,请增加单词cound。
  5. 检查字符是否为换行符。如果是这样,请增加行数。

  6. int c;
    while ( (c = in.get()) != EOF )
    {
       ++charNum;
       if (isspace(c) )
       {
          ++wordNum;
       }
    
       if ( c == '\n' )
       {
          ++lineNum;
       }
    }