Как редактировать первую строку в текстовом файле в C ++? - PullRequest
3 голосов
/ 21 марта 2010

У меня текстовый файл выглядит так:

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 ++? Кто-нибудь может мне помочь?

Спасибо, Хоанг

Ответы [ 3 ]

1 голос
/ 21 марта 2010

До тех пор, пока результат будет такой же длины, что и оригинал (или короче, и вы не возражаете добавить пробелы, чтобы скрыть разницу), это довольно просто: искать, где вы хотите внести изменения, записывать новые данные, и все готово:

#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" в конце.

1 голос
/ 21 марта 2010
#include <stdio.h>

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

Редактировать: Выше, конечно, в основном шутка. Реальный способ сделать это - прочитать первую строку, разбить ее на части, изменить требуемое число, выписать его, а затем следовать всем остальным строкам. Если мы знаем, что файл содержит четыре целых числа (с плавающей точкой?) В первой строке, может быть достаточно что-то вроде этого:

#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;
}
0 голосов
/ 21 марта 2010

Вы можете использовать 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.
}

Я, наверное, облажался с использованием оператора вставки. Но вы можете сослаться на MSDN для точности использования wfstream. Я бы абсолютно не советовал использовать любое решение C, все их функции манипуляции со строками действительно отстой.

...