首页 > 解决方案 > (C++) 为什么不计算文本文件中的额外空行?

问题描述

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

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

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

234
453
657



函数4再次返回。

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


编辑:

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

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

numberOfLines我在没有确保实际读取该行的情况下递增。

标签: c++text-files

解决方案


首先,您numberOfLines++;inputFile >> data;不检查读取是否成功的情况下进行操作。这很糟糕,并导致额外的计数。

其次,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;
}

推荐阅读