1. ホーム
  2. c++

[解決済み] 既存のテキストファイルの上書き c++

2022-02-04 10:24:18

質問事項

最初の図に到達するまで現在のファイルの行をコピーし、それからprintメソッドを使って図の情報を印刷し、タグを閉じると、このようになります。

std::ofstream newFile(filePath1_fixed, std::ios::app);
std::fstream openedFile(filePath);
std::string line1;
while (std::getline(openedFile, line1)) {
    if (line1.find("<rect") != std::string::npos
        || line1.find("<circle") != std::string::npos
        || line1.find("<line") != std::string::npos)
        break;
    newFile << line1 << std::endl;
}
figc.printToFile(newFile);
newFile << "</svg>\n";

私の質問は、現在のファイルに変更を保存する方法ですか?私はこのようなものを試してみました。

std::ifstream openedFile(filePath);
std::ofstream newFile(filePath, std::ios::app);
std::string line1;
std::string info_beg[100];
int t = 0;
while (std::getline(openedFile, line1)) {
    std::cout << "HELLYEAH";
    if (line1.find("<rect") != std::string::npos
        || line1.find("<circle") != std::string::npos
        || line1.find("<line") != std::string::npos)
        break;
    info_beg[t++] = line1;
}
for (int i = 0; i < t; i++)
    newFile << info_beg[i] << std::endl;
figc.printToFile(newFile);
newFile << "</svg>\n";

これが一番近いところです。これを手に入れる。

  <?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
     xmlns="http://www.w3.org/2000/svg" version="1.1">
  <desc>Example rect01 - rectangle with sharp corners</desc>

  <!-- Show outline of canvas using 'rect' element -->
  <rect x="1" y="1" width="1198" height="398"
        fill="none" stroke="blue" stroke-width="2" />

  <line x1="20" y1="100" x2="100" y2="20"
        stroke="red" stroke-width="2" />

  <rect x="20" y="30" width="40" height="50"
        fill="red" stroke="red" stroke-width="1" />

  <rect x="10" y="20" width="30" height="40"
        fill="red" stroke="blue" stroke-width="1" />

  <line x1="100" y1="200" x2="300" y2="400"
        stroke="red" stroke-width="2" />

  <circle cx="10" cy="20" r="30"
        fill="red" stroke="blue" stroke-width="2" />

</svg>
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="12cm" height="4cm" viewBox="0 0 1200 400"
     xmlns="http://www.w3.org/2000/svg" version="1.1">
  <desc>Example rect01 - rectangle with sharp corners</desc>

  <!-- Show outline of canvas using 'rect' element -->
  <rect x="1" y="1" width="1198" height="398"
        fill="none" stroke="blue" stroke-width="2" />

  <line x1="20" y1="100" x2="100" y2="20"
        stroke="red" stroke-width="2" />

  <rect x="20" y="30" width="40" height="50"
        fill="red" stroke="red" stroke-width="1" />

  <rect x="10" y="20" width="30" height="40"
        fill="red" stroke="blue" stroke-width="1" />

  <line x1="100" y1="200" x2="300" y2="400"
        stroke="red" stroke-width="2" />

  <circle cx="10" cy="20" r="30"
        fill="red" stroke="blue" stroke-width="2" />

  <rect x="10" y="20" width="30" height="40"
        fill="red" stroke="blue" stroke-width="2" />

</svg>

だから、私の実際の質問は、最初に削除するか、上書きするか、私は別の方法を必要とする方法です。

どのように解決するのですか?

使用方法 ios::trunc の代わりに ios::app

使用方法 std::ios::app のコンストラクタで std::ofstream は、プログラムにファイルに追加し、上書きしないように指示します。もし上書きしたい (つまり切り捨てる) 場合は std::ios::trunc は、既存のファイルを上書きするようにプログラムへ指示します。 ofstream はデフォルトでこれを行うので、初期設定を単に std::ofstream newFile(filePath); .

また、ファイルの読み込みと書き込みを同時に行おうとすると、うまくいきません。使用方法 ifstream を使用してデータをバッファに取り込み、次に close() でファイルを閉じます。そして、newFileを初期化してファイルを上書きし、バッファを書き出します。