2017-04-12 9 views
0

私は、行の先頭に*というコメントを付けることによって入力ファイルからいくつかのパラメータ値を読み込む必要があります。 「有用な」行の値は次のようにセミコロンで区切られています。C++ - 出力ストリームの行の先頭にある文字を別のものに置き換える

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

と私は私の入力ファイル内でこのように複数のラインを持っています。

*を各行の先頭に挿入すると、2回目にファイルを読むと次の行をスキップして次の行に直接進みます1。

私の目的は、自分のプログラムの複数のインスタンスを同時に実行し、必要な入力パラメータを得るためにファイルに順番にアクセスすることです。だから私は、それぞれのインスタンスが異なるパラメータを取得したい。

私は何を考えてこのように、各行の先頭にダミーの文字を挿入します*と、その後

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

とそれを置き換える(この例ではb)ように私はそれを読んで2回目に私はその行を読むとコメントとして扱われます。

私はpeek()コールでbを読んでたらput('*')<< '*'を使用しようとしたが、*文字は常にファイルの末尾に追加されます。私はそれを読んだが、私はファイルの途中で上書きすることはできないが、ファイルの途中に書き込むことはできない。私に何ができる?ここで

が可能な入力ファイルの例です:

* 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

あなたのインスタンスプログラムがどのパラメータを使用しているかを知る必要はありませんか?私は、それぞれのインスタンスに対して1つのパラメータファイルを使用し、コマンドライン引数としてファイル名を渡すことができます。または、単一のファイルを主張する場合は、ファイル内の指定された行から各インスタンスにパラメータを読み込ませます(コマンドラインの引数として渡します)。 Imhoはあなたのプログラムのいくつかのインスタンスを同じファイルに読み書きするだけで、不必要なオーバーコンプリートになります。 – user463035818

+0

基本的な問題は、いくつかの追加の同期がなければ、プログラムの複数のインスタンスが同じ行を読み込む競合状態を防ぐことができないことですそれらのいずれかが回線を更新するための変更を取得します。あなたがその問題を解決したときには、元の問題をよりクリーンな方法で解決できるという追加の利点があります。 –

+0

@MichaelBurr私はそれを知っています。もちろん、一度に同じファイルから複数のスレッドを読み取る前に、ある種の同期を実装するつもりです。しかし、私はこの問題に単純な答えがあるかどうか知りたいと思っていました – jackscorrow

答えて

1

だからあなたはあなたが読んでいるファイルを変更したいですか?その後、基本的に最初から書き直す必要があります。

一般的な方法の1つは、ファイル全体をメモリに読み込み、メモリ内のバッファを変更し、ファイルを(変更された)インメモリバッファで上書きすることです。

もう1つの一般的な方法は、ファイルがメモリに収まるように大きくなるようにするには、1行ずつ読み込んで行を修正し、新しい一時ファイルに書き込む方法です。そして、すべての入力が読み込まれたら、一時ファイルの名前を実際のファイルに変更して、その中のデータを置き換えます。

これらの解決策の両方は、交換する行の先頭にbのような特殊なマーカー文字を使用しなくても使用できます。

+0

しかし、私がしたいのは、 'char'を同じスペースを占める' char'と置き換えることです。ファイル全体を最初から書き込む必要がありますか? – jackscorrow

+0

@jackscorrow特殊文字を置き換える正しい位置を見つけるためにファイルを*シークする*必要があります。実際に私が答えてくれた可能な方法よりも多くの仕事があるかもしれません。また、私の考えられる解決策では、特殊文字を持つ必要がないので、最初の数字を読みやすくなります(文字列として読み込む必要はなく、最初の文字を削除して文字列を整数値)。 –

+0

私はこれで最後に行くつもりだと思う。しかし、あなたは文字列としてそれを_readし、最初の文字を削除し、文字列を整数値_に変換すると言いました。私の無知を許しますが、整数または倍数を読み取る他の方法はありますか?それらは正確にこの種の値を格納するために私が従う手順です。 – jackscorrow

関連する問題