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