3

次のようなテキストファイルがあります。

100 50 20 90
4.07498 0.074984
37.1704 28.1704
20.3999 14.3999
48.627 35.627 ....

このファイルを編集して、最初の行の 3 番目の項目を除いてすべてが同じになるようにする必要があります。出力は次のようになります。

100 50 19 90
4.07498 0.074984
37.1704 28.1704
20.3999 14.3999
48.627 35.627
....

どうすれば c++ でできますか? 誰でも私を助けることができますか?

ありがとう、ホアン

4

3 に答える 3

1
#include <stdio.h>

int main()
{
      FILE *pFile;
      pFile = fopen("example.txt", "r+");
      fseek(pFile, 7, SEEK_SET);
      fputs("19", pFile);
      fclose(pFile);
      return 0;
}

編集:もちろん、上記はほとんど冗談でした。それを行う実際の方法は、最初の行を読み、それを部分に分割し、必要な数を変更し、それを書き出してから、残りのすべての行をたどることです. ファイルの最初の行に 4 つの整数 (浮動小数点数?) が含まれていることがわかっている場合は、次のようなもので十分です。

#include <fstream>
#include <iostream>
using namespace std;

int main ()
{
    ifstream in("in.txt");
    ofstream out("out.txt");
    float v1, v2, v3, v4;
    in >> v1 >> v2 >> v3 >> v4;
    v3 = 19.1234; // <- Do whatever you need to here.
    out << v1 << " " << v2 << " " << v3 << " " << v4;
    out << in.rdbuf();
    out.close();
    in.close();
    return 0;
}
于 2010-03-20T23:29:58.513 に答える
1

結果が元のものと同じ長さ (またはそれより短く、違いを埋めるためにスペースを追加しても構わない) である限り、それは非常に簡単です: 変更を行いたい場所を探し、新しいデータを書き込んでください。やり直し:

#include <fstream>
#include <ios>

int main() { 
    std::fstream file("yourfile.txt", std::ios::in | std::ios::out);
    file.seekp(7);
    file << "19";
    return 0;
}

書き込みたいデータが保存したい他のものの間に「収まらない」場合は、ファイルの残りの部分を書き直す必要があります。通常は、古いファイルから新しいファイルにコピーし、必要に応じてデータを変更します。途中で。

編集:次のようなもの:

#include <fstream>
#include <ios>
#include <iterator>
#include <vector>

int main() { 
    std::vector<double> data;

    std::fstream file("yourfile.txt", std::ios::in | std::ios::out);
    std::copy(std::istream_iterator<double>(file), 
        std::istream_iterator<double>(),
        std::back_inserter(data));
    file.clear();
    file.seekp(0);
    data[2] = 19.98;
    std::copy(data.begin(), data.end(), std::ostream_iterator<double>(file, " "));
    return 0;
}

これには、望ましくない効果がいくつかあります。特に、現状では、元の「行」指向の構造が何であれ破棄され、結果が 1 つの長い行として単純に書き出されます。それを避けたい場合は、(たとえば)一度に1行ずつ読み取り、行内の数値を変換し(たとえば、stringstreamに入れ、そこからdoubleとして読み取る)、それらを変更し、結果を文字列に戻し、最後に「\n」を付けて行を書き出します。

于 2010-03-20T23:41:05.917 に答える
0

std::wfstream を使用できます。

#include <fstream>

using namespace std;
int main() {
    wfstream file(L"example.txt", std::ios::in | std::ios::out);
    std::wstring first, second, third; // The extraction operator stops on whitespace
    file >> first >> second >> third;
    third = L"Whatever I really, really, want!";
    file << first << second << third;
    file.flush(); // Commit to OS buffers or HDD right away.
}

私はおそらく挿入演算子の使用を台無しにしました。ただし、wfstream の使用の正確さについては、MSDN を参照できます。C ソリューションを使用しないことを絶対にお勧めします。それらのすべての文字列操作関数は本当にひどいものです。

于 2010-03-20T23:41:47.523 に答える