在 C++ 中读取文本文件的最后一个空行

Read last empty line of a text file in C++

提问人:Saku 提问时间:8/22/2022 更新时间:8/23/2022 访问量:133

问:

我尝试

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

vector<string> readLines(string filename)
{
    ifstream infile(filename);
    vector<string> v;
    string line;
    bool good;
    do {
        good = getline(infile, line).good();
        if (!good) break; //<---- if exists, or not - is bad
        v.push_back(line);
    } while (good);
    return v;
}

int main() {
    auto v = readLines("test.txt");
    for (auto &line:v)
        cout << ">" << line << endl;
}

如果我断开循环,向量中没有最后一行,如果没有断开 - 添加空行,尽管不在文件中。 我想用测试文件进行精确测试,如果存在,最后一个空行很重要。

C++ 矢量 fstream IOSTREAM

评论

2赞 001 8/22/2022
while (getline(infile, line) && !line.empty()) { v.push_back(line); }??
0赞 463035818_is_not_an_ai 8/22/2022
不确定我是否理解这个问题。您的文件末尾有一个空行,但此代码无法正确读取?您想读取最后一行空行并将其包含在向量中吗?
0赞 Saku 8/23/2022
while (getline(infile, line) && !line.empty()) { v.push_back(line); } 停在第一个空行;我有两个文件:一个文件末尾有空行,第二个文件没有。我希望在读取第一个文件后,末尾向量处的空字符串和读取第二个文件后 - 不是。

答:

0赞 Saku 8/23/2022 #1

解决方案很简单:

#include <iostream>
#include <fstream>

#include <vector>
using namespace std;
vector<string> readLines(string filename)
{
    ifstream infile(filename);
    vector<string> v;
    string line;
    bool readedNewline;
    if (infile.peek() != EOF)
    while(true) {
        readedNewline = getline(infile, line).good();
        v.push_back(line);
        if (!readedNewline) break;
    }
    return v;
}

int main() {
    auto v = readLines("test.txt");
    for (auto &line:v)
        cout << ">" << line << endl;
}

getline().good() 如果 after line 是换行符字符,则返回 true。 推送到向量最后不good(),因此我必须检查文件是否不为空(peek())