ifstream和ofstream:如何对文件进行多次修改

ifstream and ofstream: How do I perform multiple modifications to a file?

本文关键字:修改 文件 ofstream ifstream      更新时间:2023-10-16

我已经谷歌搜索了几个小时,似乎找不到任何解决问题的问题。

我对C 的文件操作进行了危险,但是过去36个小时中,我花了大约20个阅读文档和论坛问题,试图将一个朋友聚集在一起。

说我有一个名为raw_questions.txt的文件,我想对其进行一些更改。该文件是考试的学习指南,并有一个问题,然后是4个多项选择答案。我想删除空白行并添加一些令牌,以允许我正在研究的另一个程序来解析它。我已经编写了一个格式化程序来执行这些操作。操作是:

  1. 从源文件中删除空白行,因为它看起来是双间隔
  2. 在每个问题的结尾添加一个定界符字符('@'),答案。
  3. 使用定界符,阅读每个问题并作为字符串回答并将其附加到带有令牌的输出文件。问或答案,这将使我的其他程序知道是否线包含一个问题或答案。

我的问题:我一直陷入如何从一个操作转移到另一个操作。我当前的方法是将每行读为字符串,在字符串上执行操作,然后将新字符串添加到输出文件中。使用此方法,要执行下一个操作,我必须将上一个操作的输出文件作为我的新输入文件打开,并为该操作制作新的输出文件。我觉得有一种更好的方法,但是就像我说的那样,我对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;
            }
        }
    }
}

我目前也试图教自己git,所以我碰巧在这里托管了该项目。我不知道上下文是否会使我想做的事情变得有意义,但是我要发布它。

奖励问题:我一直在努力,但是我没有想出添加定界符的解决方案。答案似乎是一行长的一行,因此我可能只需将定界符添加到以" A)等开始的任何行的末尾,但是有些问题更长。我的想法是找到" a)"的任何出现,并将定界符添加到上面的行末端,但我想不出如何做到这一点。谁能指向我的正确指示FSTREAM的会员功能可能会有所帮助?

感谢您的阅读。

流不会神奇地将整个文件读为内存。如果那是您想做的,您应该这样做:我的猜测是您的文件比可用的内存小得多,并且使用标准的C 容器可以更容易执行所有操作。