我想使用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
?
答案 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)
鉴于你的限制,我建议:
int c;
while ( (c = in.get()) != EOF )
{
++charNum;
if (isspace(c) )
{
++wordNum;
}
if ( c == '\n' )
{
++lineNum;
}
}