ifstream和ofstream:如何对文件进行多次修改
ifstream and ofstream: How do I perform multiple modifications to a file?
我已经谷歌搜索了几个小时,似乎找不到任何解决问题的问题。
我对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;
}
}
}
}
我目前也试图教自己git,所以我碰巧在这里托管了该项目。我不知道上下文是否会使我想做的事情变得有意义,但是我要发布它。
奖励问题:我一直在努力,但是我没有想出添加定界符的解决方案。答案似乎是一行长的一行,因此我可能只需将定界符添加到以" A)等开始的任何行的末尾,但是有些问题更长。我的想法是找到" a)"的任何出现,并将定界符添加到上面的行末端,但我想不出如何做到这一点。谁能指向我的正确指示FSTREAM的会员功能可能会有所帮助?
感谢您的阅读。
流不会神奇地将整个文件读为内存。如果那是您想做的,您应该这样做:我的猜测是您的文件比可用的内存小得多,并且使用标准的C 容器可以更容易执行所有操作。
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 已修改的LinkedList未在文本文件本身中更新
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 什么文件可以修改 atom 的C++语法?
- 修改生成文件以简化框架 #include 路径
- Windows std::fstream 修改文件后打开()?
- Chilkat SFTP 文件修改时间不与上传更新
- 如何在 Windows 上的 C++ 中根据文件的修改时间读取目录中的文件
- 如何使用Winforms C#或C++.Net在不更改文件中其他内容的情况下修改jpg文件中的Orientation e
- 如何修改Lambda表达式以将输出放入文本文件
- 我如何确保修改.H文件时,使用Visual Studio 2008将包括其在内的.cc文件自动编译
- 在 Windows 中修改文件夹时通知我的应用程序
- C++ - 修改文件而不创建新文件
- 如何在C++的目录中查找具有通配符匹配的最后一个修改文件
- C++:无法修改文件中的某个记录
- 如何修改文件夹中所有文件的代码
- 读取和修改文件的最佳方式(c++)
- MAKEFILE:在不修改文件的情况下将目标视为已更新
- iPhone:在Xcode中编译C++文件而不修改文件扩展名
- 每次修改文件时运行getline