我正在尝试从文件中删除空行。目前它会删除除我在第 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)
求值为 a
和 b
的最小值。如果您需要/想要了解更多信息,请点击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;
}