2017-10-24 4 views
2

複数行のテキストファイルを編集したいとします。すべての行で最初の文字がスペースであれば削除したい。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"; 
    } 

これまでのところ、コードはファイル内で何も変更されません。

ありがとうございました。

+1

ファイルを編集する*細かい作業は、ファイル全体(おそらく文字列のベクトル)を読み込み、変更してから書き出すことを検討してください。 – vu1p3n0x

+0

別のヒント:多くの場合、プログラムとオペレーティングシステムの機能を組み合わせると便利です。例えば、 gnu sedは '--inplace'オプションを持っていますが、これは標準出力' sed'を使ってstdoutに書き出すだけではなく、オペレーティングシステム*の助けを借りて出力をリダイレクトすることも珍しいことではありません。結果に満足すれば、古いファイルを単に新しいファイルで上書きすることができます。例えば。 'sed 's/^。* // g' some.txt> tmp.txt && mv tmp.txt file.txt'。その理由は、ファイルの取り扱いがOSシェルによって既にうまく行われており、stdoutへの書き込みが驚くほど多目的であるためです。 –

+0

手元にある主題について(これは以前の投稿への修正です):現在、ファイルに書き戻しはしていません。おそらくファイルをメモリに保存し(@ vu1p3n0xの提案を使用して)、それを修正してからディスク上のファイルに書き戻したいと思うでしょう。私はファイルを書き直すもっとも簡単な方法は、入力ストリームを閉じ、 'trunc'オプションを使って書き込むために再オープンすることだと思います。[here](https://stackoverflow.com/a/24189274/) 3150802)。以前の 'seekg'を使う私の提案は、ファイルを切り捨てるのではなく、最初のものを上書きするだけです(オリジナルよりも行が少なくなっています)。 –

答えて

-2

次の2つのファイルでそれを行うことができます。

// TODO: error checking! 
fstream file1; 
file1.open(path1, ios::in); 
fstream file2; 
file2.open(path2, ios::out | ios::trunc); 

while (getline(file1, line)) 
{ 
     if (!line.empty() && line[0] == ' ') 
      file2 << line.substr(1) << "\n"; 
     else 
      file2 << line << "\n"; 
} 

file2.close(); 
file1.close(); 

またはostringstreamを使用しています。

// TODO: error checking! 
fstream file; 
file.open(path, ios::in); 
ostringstream osstream; 

while (getline(file, line)) 
{ 
     if (!line.empty() && line[0] == ' ') 
      osstream << line.substr(1) << "\n"; 
     else 
      osstream << line << "\n"; 
} 

file.close(); 
file.open(path, ios::out | ios::trunc); 
file << osstream.str(); 
file.close(); 
+0

しかし、質問者は1つのファイルでそれをやりたがっています: "しかし、私は入力と出力を同じファイルにします" – tambre

+0

行に文字がまったく入っているという保証はないと思います。 –

0

これまでのコードでは、私のファイルには何も変わりません。

あなたの問題は、あなたが(私は単なる文字列であると推定)の行を修正するが、ファイルへのあなたの助けのための

2

おかげでそれを書き戻すされていないということです!私はvu1p3n0xが提案したようにすべてをベクトルに保存しました。また、私は名前空間を削除しました(もしそうなら)。私は将来のプログラムでもそうします。私はタンブレのおかげでそのことを決して考えなかった。

私はコードが完全ではないと思っていますが、ここには誰かがそれを必要とする場合があります。

  std::ifstream filein; 
      std::string line; 
      filein.open(help); 
      std::vector<std::string> temp; 

      while (std::getline(filein, line)) 
      { 
       if (!line.empty()) 
       { 
        if (line[0] == ' ') 
        { 
         line.erase(0, 1); 
        } 
       } 
       temp.push_back(line); 
      } 
      filein.close(); 

      std::ofstream fileout; 
      fileout.open(help, std::ofstream::out, std::ofstream::trunc); 

      int l = 0; 
      while (l < temp.size()) 
      { 
       //cout << temp[l] << "\n"; 
       fileout << temp[l] << "\n"; 
       l++; 
      } 
      fileout.close(); 
+0

フィルターを書いています。 https://stackoverflow.com/a/5917752/85371 – sehe

関連する問題