C++ ifstream和ofstream:如何对文件执行多个修改?

C++ ifstream和ofstream:如何对文件执行多个修改?,c++,parsing,fstream,C++,Parsing,Fstream,我在谷歌上搜索了几个小时,似乎找不到任何能解决这个问题的方法 我在C++中对文件操作有点迷惘,但在过去36小时里,我花了大约20的时间阅读文档和论坛问题,试图为朋友们一起做一个项目。 假设我有一个名为raw_questions.txt的文件,我想对其进行一些更改。这个文件是一个考试的学习指南,有一个问题和4个选择题。我想删除空行并添加一些标记,以允许我正在处理的另一个程序对其进行解析。我已经编写了一个格式化程序来执行这些操作。行动包括: 删除源文件中的空行,因为它看起来是双倍行距的 在每个问题的

我在谷歌上搜索了几个小时,似乎找不到任何能解决这个问题的方法

我在C++中对文件操作有点迷惘,但在过去36小时里,我花了大约20的时间阅读文档和论坛问题,试图为朋友们一起做一个项目。 假设我有一个名为raw_questions.txt的文件,我想对其进行一些更改。这个文件是一个考试的学习指南,有一个问题和4个选择题。我想删除空行并添加一些标记,以允许我正在处理的另一个程序对其进行解析。我已经编写了一个格式化程序来执行这些操作。行动包括:

  • 删除源文件中的空行,因为它看起来是双倍行距的
  • 在每个问题的末尾添加分隔符(“@”),然后 回答
  • 使用分隔符,将每个问题和答案作为字符串读入 并将其附加到输出文件中,并在 问题或答案,这将让我的其他程序知道 行包含一个问题或答案
  • 我的问题是:我被困在如何从一个手术转移到下一个手术。我目前的方法是将每一行读入一个字符串,对该字符串执行操作,并将新字符串添加到输出文件中。使用这种方法,要执行下一个操作,我必须打开上一个操作的输出文件作为新的输入文件,并为该操作创建一个新的输出文件。我觉得必须有更好的方法,但是就像我说的,我对C++中的文件操作很迷茫。在这种情况下我该怎么办

    我考虑过创建一个ifstream和ofstream,两者都指向同一个文件,并希望当ifstream文件打开时,它会在内存中存储一个临时副本。然后,在我逐行读取并写入ofstream对象之后,当它关闭时,它将覆盖我的旧文件。我不知道这是否有意义,我甚至不认为fstream就是这样工作的

    到目前为止,我拥有的代码:

    #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,我甚至没有想过使用列表,但这听起来正是我需要的。我只是刚刚熟悉了标准库。谢谢你的回复,如果你把它放在实际的回复中,我会标记解决了。