2017-04-12 95 views
0

我需要做的是从输入文件中读取一些参数值,其中在该行的开头加上*来标识注释。在“有用”行值由分号像这样分离:C++ - 在输出流的行首替换一个字符与另一个字符

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('*')<< '*'一次我和一个peek()调用read b*角色总是在文件的末尾。我读过,虽然我不能在文件中间写入文件,但可以在文件中间覆盖。我能做什么?

这里是一个可能的输入文件的例子:

* 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; 
+0

你不需要知道你的程序实例使用什么参数?我可能会为每个实例使用一个参数文件,并将该文件名作为命令行参数传递。或者,如果您坚持使用单个文件,那么我会让每个实例从文件中的给定行读取其参数(再次作为命令行参数传递)。 Imho有几个程序读取和写入同一文件的实例只是不必要的过度复杂 – user463035818

+0

一个基本问题是,如果没有一些额外的同步,您将无法防止多个程序实例读取同一行之前的竞争条件他们中的任何人都会更新以更新该行。如果/当你解决了这个问题,那么你就可以以更简洁的方式解决你原来的问题。 –

+0

@MichaelBurr我知道。当然,我将在实际上有多个线程同时从同一个文件读取之前实现某种同步。但我很想知道这个问题是否有一个简单的答案 – jackscorrow

回答

1

所以要修改,你正在阅读的文件吗?那么你基本上必须从头开始重写它。

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

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

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

+0

但我想要做的是用另一个'char'替换一个'char',它将占用相同的空间。我是否仍然需要从头开始编写整个文件? – jackscorrow

+0

@jackscorrow你必须*通过文件寻找*来找到替换特殊字符的正确位置。在我的回答中,实际上可能比我所说的可能的方法更多的工作。另外,对于我提出的可能的解决方案,您不必具有特殊字符,这样可以更轻松地读取第一个数字(您不必将其读作字符串,删除第一个字符,然后将字符串转换为一个整数值)。 –

+0

好的。我想我会最终与这一切。但你说 - 将它作为一个字符串读取,删除第一个字符,并将字符串转换为整数值_,请原谅我的无知,但还有其他方法来读取整数或双数吗?因为这些正是我为了存储这种值而正在遵循的步骤 – jackscorrow

相关问题