複数行のテキストファイルを編集したいとします。すべての行で最初の文字がスペースであれば削除したい。fstreamはC++でテキストファイルを編集する適切な方法ですか?
ifstreamとofstreamで複数の例が見つかりました。しかし、入力ファイルと出力ファイルは異なるファイルです。
しかし、入力と出力を同じファイルにしたいのですが、fstreamが動作するかどうか、どのように動作するかはわかりません。
fstream file;
file.open(path, ios::in | ios::out);
while (getline(file, line))
{
if (line[0] == ' ')
{
line.erase(0, 1);
}
file << line << "\n";
}
これまでのところ、コードはファイル内で何も変更されません。
ありがとうございました。
ファイルを編集する*細かい作業は、ファイル全体(おそらく文字列のベクトル)を読み込み、変更してから書き出すことを検討してください。 – vu1p3n0x
別のヒント:多くの場合、プログラムとオペレーティングシステムの機能を組み合わせると便利です。例えば、 gnu sedは '--inplace'オプションを持っていますが、これは標準出力' sed'を使ってstdoutに書き出すだけではなく、オペレーティングシステム*の助けを借りて出力をリダイレクトすることも珍しいことではありません。結果に満足すれば、古いファイルを単に新しいファイルで上書きすることができます。例えば。 'sed 's/^。* // g' some.txt> tmp.txt && mv tmp.txt file.txt'。その理由は、ファイルの取り扱いがOSシェルによって既にうまく行われており、stdoutへの書き込みが驚くほど多目的であるためです。 –
手元にある主題について(これは以前の投稿への修正です):現在、ファイルに書き戻しはしていません。おそらくファイルをメモリに保存し(@ vu1p3n0xの提案を使用して)、それを修正してからディスク上のファイルに書き戻したいと思うでしょう。私はファイルを書き直すもっとも簡単な方法は、入力ストリームを閉じ、 'trunc'オプションを使って書き込むために再オープンすることだと思います。[here](https://stackoverflow.com/a/24189274/) 3150802)。以前の 'seekg'を使う私の提案は、ファイルを切り捨てるのではなく、最初のものを上書きするだけです(オリジナルよりも行が少なくなっています)。 –