До тех пор, пока результат будет такой же длины, что и оригинал (или короче, и вы не возражаете добавить пробелы, чтобы скрыть разницу), это довольно просто: искать, где вы хотите внести изменения, записывать новые данные, и все готово:
#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;
}
Это имеет несколько эффектов, которые вам могут не понадобиться - в частности, в том виде, в каком они есть, он разрушает любую «ориентированную на строки» структуру, которую мог иметь оригинал, и просто записывает результат в виде одной длинной строки. Если вы хотите избежать этого, вы можете (например) читать по очереди за раз, преобразовывать числа в строке (например, помещать их затем в поток строк, затем читать их оттуда как двойные), изменять их, помещать вернитесь обратно в строку и запишите строку с "\ n" в конце.