c++ - 删除文件中的空行

我正在尝试从文件中删除空行。目前它会删除除我在第 35 行添加的所有内容:out_file << data_vector[i] << "\n";

如何排除最后一个 "\n" 使其不添加新行?

这是完整的功能:

std::vector<std::string> Data::Data::ReadData() {

    std::regex find_empty_line("^(\\s*)$");
    std::smatch match;

    std::string data, fel;
    std::vector<std::string> data_vector;

    std::ifstream in_file;
    in_file.open(file_name);

    if (in_file.is_open()) {
        while (in_file.good()) {
            std::getline(in_file, data);
            data_vector.push_back(data);
        }
    }

    in_file.close();

    std::ofstream out_file;
    out_file.open(file_name);

    if (out_file.is_open()) {
        for (int i = 0; i < data_vector.size(); ++i) {
            if (!data_vector[i].empty()) {
                out_file << data_vector[i] << "\n";
                std::cout << data_vector[i] << "\n";
            }
        }
    }

    out_file.close();

    return data_vector;

}

回答1

这是最佳实践(在大多数操作系统上),并且是许多文件处理工具所期望的,在文件的每一行末尾都有一个换行符,因此您通常不想删除最后的换行符......考虑它是一个后面没有行的行终止字符,而不是后面带有隐式空行的行分隔符。

但是,如果你真的必须避免使用你坚持使用的工具,那么避免在最后一行输出它的一种简单方法是:

out_file << data_vector[i] << (i < data_vector.size() - 1) ? "\n" : "");

如果你不熟悉三元条件运算符,基本形式是:

conditional-expression ? expression-used-if-true : expression-used-if-false

示例:(a <= b ? a : b) 求值为 ab 的最小值。如果您需要/想要了解更多信息,请点击https://en.cppreference.com/w/cpp/language/operator_other#Conditional_operator

然后,为了使它工作,我们需要确保 data_vector 中的最后一行是输出的最后一行,它目前可能不是因为我们有一些空行,所以让我们在填充向量时过滤掉它们(无需检查 good()):

while (std::getline(in_file, data))
    if (!data.empty())
        data_vector.push_back(data);

知道 data_vector 中没有空行,然后让我们简化输出循环:

for (int i = 0; i < data_vector.size(); ++i) {
    out_file << data_vector[i]
             << (i < data_vector.size() - 1) ? "\n" : "");
    std::cout << data_vector[i] << "\n";
}

(这确实假设您不希望返回的 vector 中出现空行......)

回答2

如何排除最后一个“\n”,使其不添加新行?

仅当您有后续行也输出时才输出 \n ,例如:

std::vector<std::string> Data::Data::ReadData() {

    std::vector<std::string> data_vector;

    std::ifstream in_file(file_name);
    if (in_file.is_open()) {
        std::string data;
        while (std::getline(in_file, data)) {
            data_vector.push_back(data);
        }
        in_file.close();
    }

    std::ofstream out_file(file_name);
    if (out_file.is_open()) {
        bool output_line_break = false;
        for (int i = 0; i < data_vector.size(); ++i) {
            if (!data_vector[i].empty()) {
                if (output_line_break) {
                    out_file << '\n';
                }
                else {
                    output_line_break = true;
                }
                out_file << data_vector[i];
                std::cout << data_vector[i] << '\n';
            }
        }
        out_file.close();
    }

    return data_vector;
}

相似文章

随机推荐

最新文章