c ++ - 将输出流中行开头的一个字符替换为另一个字符

时间:2017-04-12 13:41:58

标签: c++ fstream

我需要做的是从输入文件中读取一些参数值,通过将*放在行的开头来识别注释。 "有用的值#34;这些行用分号分隔,如下所示:

10; 32541615; 0.18; 0.45; 0.00015; 0.01485; 0.03;

我的输入文件中有这样的多行。

我想要做的是在每行的开头插入一个*,一旦我以这样的方式阅读它,如果我第二次读取该文件,我将跳过该行直接进入下一个。

我需要这个,因为我的目标是让我的程序的多个实例同时运行并按顺序访问文件以获得所需的输入参数。所以我想每个实例都会得到不同的参数。

我想要做的是在每行的开头插入一个虚拟字符,如下所示:

b10; 32541615; 0.18; 0.45; 0.00015; 0.01485; 0.03;

然后在我阅读时用b替换它(在此示例中为*),以便第二次读取该行时将其视为注释。

我通过put('*')来电阅读<< '*'时尝试使用bpeek(),但*字符始终附加在文件。我读过虽然我不能在文件中间写,但我可以在文件中间覆盖。我能做什么?

以下是可能的输入文件示例:

* FORMAT:
* MAX_HEIGHT; SEED; p0; p1; pd; pp; epsilon;

b10; 32541615; 0.18; 0.45; 0.00015; 0.01485; 0.03;
b40; 32541615; 0.18; 0; 0.00015; 0.01485; 0.03;

1 个答案:

答案 0 :(得分:1)

所以你想要修改你正在阅读的文件?然后你基本上必须从头开始重写它。

一种常见的方法是将整个文件读入内存,修改内存缓冲区,然后用(修改的)内存缓冲区覆盖文件。

另一种常见的方法,如果文件要大到适合内存,则逐行读取,修改行,并将其写入新的临时文件。然后,当读取了所有输入后,将临时文件重命名为实际文件,从而替换其中的数据。

这两种解决方案都可以在不需要任何特殊标记字符的情况下使用,例如要替换的行开头的b