(C++) 为什么不计算文本文件中的额外空行?

(C++) Why are additional blank lines in the text file not being counted?

我创建了这个函数来 return 文本文件中的行数:

int numberOfLinesInFile(string dataFile){            
    ifstream inputFile;
    inputFile.open("data.txt");
    int numberOfLines, data;

    while(!inputFile.eof()){
        inputFile >> data;
        numberOfLines++;
    }

    cout << "Number of lines: " << numberOfLines << endl;
    inputFile.close();
    return numberOfLines;
}

我注意到的一件有趣的事情是,该函数正确地计算了非空行(以及最后一个额外的空行)的数量,但没有计算额外的空行。例如,如果这是我的文件:

234
453
657

然后函数 returns 4,因为文本文件中有四行。但是,如果我的文件末尾包含多个空行:

234
453
657



函数 returns 4 再次。

为什么会这样?这与eof指令有关吗?


编辑:

好的,谢谢@MikeCAT 让我明白了问题出在哪里。根据@MikeCAT 的回答,我将 while 循环更改为:

while(!inputFile.eof()){
        if(inputFile >> data)
            numberOfLines++;
        else{
            cout << "Error while reading line " << numberOfLines + 1 << "!" << endl;
        }
}

我在递增 numberOfLines 时不确定是否实际读取了该行。

首先,您在 inputFile >> data; 之后执行 numberOfLines++; 而不检查读取是否成功。这很糟糕,会导致额外的计数。

其次,inputFile >> data;读取整数并跳过整数前的空白字符

为避免这些问题,您应该使用std::getline()来计算行数。

另外别忘了初始化numberOfLines

int numberOfLinesInFile(string dataFile){            
    ifstream inputFile;
    inputFile.open("data.txt");
    int numberOfLines = 0;
    std::string data;

    while(std::getline(inputFile, data)){
        numberOfLines++;
    }

    cout << "Number of lines: " << numberOfLines << endl;
    inputFile.close();
    return numberOfLines;
}