2015-04-02 61 views
0

我想使用ifstream来读取C++中的文本文件,以了解单词,字符,行数。如何使用ifstream读取txt文件时检查EOF

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

回答

0

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

你可以简单地做:

while (in) 

除了不清除任何标志。

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

0

in.getline(temp, 30);返回istream&所以在while循环中将它移动到这里while(in.getline(temp, 30))当它到达文件结尾或读取错误时将返回false。

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; 
0

鉴于你的约束,我建议:

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


int c; 
while ((c = in.get()) != EOF) 
{ 
    ++charNum; 
    if (isspace(c)) 
    { 
     ++wordNum; 
    } 

    if (c == '\n') 
    { 
     ++lineNum; 
    } 
}