C++ ifstream和ofstream:如何对文件执行多个修改?
我在谷歌上搜索了几个小时,似乎找不到任何能解决这个问题的方法 我在C++中对文件操作有点迷惘,但在过去36小时里,我花了大约20的时间阅读文档和论坛问题,试图为朋友们一起做一个项目。 假设我有一个名为raw_questions.txt的文件,我想对其进行一些更改。这个文件是一个考试的学习指南,有一个问题和4个选择题。我想删除空行并添加一些标记,以允许我正在处理的另一个程序对其进行解析。我已经编写了一个格式化程序来执行这些操作。行动包括:C++ ifstream和ofstream:如何对文件执行多个修改?,c++,parsing,fstream,C++,Parsing,Fstream,我在谷歌上搜索了几个小时,似乎找不到任何能解决这个问题的方法 我在C++中对文件操作有点迷惘,但在过去36小时里,我花了大约20的时间阅读文档和论坛问题,试图为朋友们一起做一个项目。 假设我有一个名为raw_questions.txt的文件,我想对其进行一些更改。这个文件是一个考试的学习指南,有一个问题和4个选择题。我想删除空行并添加一些标记,以允许我正在处理的另一个程序对其进行解析。我已经编写了一个格式化程序来执行这些操作。行动包括: 删除源文件中的空行,因为它看起来是双倍行距的 在每个问题的
#include <fstream>
#include <string>
#include "Debug.h"
Debug debugger;
void remove_empty_lines (std::ifstream& input, std::ofstream& output);
void insert_delimiter (std::ifstream& input, std::ofstream& output, char delimiter);
void create_output (std::ifstream& input, std::ofstream& output);
int main() {
debugger.set_active();
char delimiter = '@';
std::ifstream input;
std::ofstream output;
input.open("questions_source.txt");
output.open("questions_intermidiate.txt");
remove_empty_lines (input, output);
}
void remove_empty_lines (std::ifstream& input, std::ofstream& output) {
while (!input.eof()) {
std::string line;
std::getline(input, line);
if (line != "") {
output << line << std::endl;
}
}
}
void insert_delimiter(std::ifstream& input, std::ofstream& output) {
}
// This function doesn't quite work, WIP - Please ignore
void create_output(std::ifstream& input, std::ofstream& output) {
std::string line;
for (int i = 1; !input.eof(); i++) {
debugger.out("Inserting tokens.");
bool found = false;
while (!found) {
getline (input, line);
if (i < 10) {
if (line[1] == ')') {
line.erase (0, 3);
output << "[" << i << "]" << line << std::endl;
debugger.out("Found line: " + line);
found = true;
}
} else if (i < 100) {
if (line[2] == ')') {
line.erase (0, 4);
output << "[" << i << "]" << line << std::endl;
debugger.out("Found line: " + line);
found = true;
}
}
}
for (int j = 0; j < 4; j++) {
getline (input, line);
if (line[1] == ')') {
line.erase (0, 3);
output << "[" << i << "a]" << line << std::endl;
}
}
}
}
#包括
#包括
#包括“Debug.h”
调试程序;
void remove_empty_行(std::ifstream&input,std::ofstream&output);
void insert_分隔符(std::ifstream&input,std::ofstream&output,char分隔符);
void create_输出(std::ifstream&input,std::ofstream&output);
int main(){
调试器。将_设置为活动();
字符分隔符='@';
std::ifstream输入;
std::流输出;
input.open(“questions_source.txt”);
output.open(“questions_intermediate.txt”);
删除\u空\u行(输入、输出);
}
void remove_空_行(std::ifstream&input,std::ofstream&output){
而(!input.eof()){
std::字符串行;
std::getline(输入,行);
如果(行!=“”){
输出流不会神奇地把整个文件读入内存。如果你想这样做,你应该这样做:我猜你的文件比你的可用内存小得多,而且使用标准C++容器来执行所有操作可能更容易。< / P>你没有给我们一个文件的代码<代码>w_questions.txt
如果文件大小合理(比如说小于100Mb),我会亲自询问我会把它读入一个std::list
,其中每个字符串都是一行。在内存中对它进行操作,直到我满意为止,然后输出它。Insert line是添加一个新的列表节点;delete line是删除列表节点;edit line是修改字符串。@WhiZTiM,我没有在我的帖子中包含这个示例,因为我担心它会变得有点过时he long side。github repo中应该有一个名为questions_source.txt的文件。如果这样更好的话,我可以将它粘贴到这里。@Richard Criten,我甚至没有想过使用列表,但这听起来正是我需要的。我只是刚刚熟悉了标准库。谢谢你的回复,如果你把它放在实际的回复中,我会标记解决了。