2010-03-20 2 views
2

У меня есть текстовый файл выглядит следующим образом:Как отредактировать первую строку в текстовом файле в C++?

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

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

+0

Вы хотите вычесть один из третьего элемента? Может ли третий пункт быть отрицательным? – Potatoswatter

ответ

2
#include <stdio.h> 

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

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

#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

Благодарим за решение. Но я ищу более «динамический» способ, что означает, что я могу изменить 20 на любое число без перезаписи последнего числа. Пример: 20, 19.9999, 19.9998, 17.36 ... – root

+1

@tsubasa: Тогда вы должны указать это в своем вопросе. –

+1

Добавлено решение, которое действительно удовлетворяет дополнительным спецификациям и может обрабатывать новый номер, который больше, чем предыдущий. :) –

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; 
} 

Если данные вы хотите написать вон» t "fit" между другими вещами, которые вы хотите сохранить, вам нужно перезаписать оставшуюся часть файла, обычно копируя из старого файла в новый, изменяя данные по мере необходимости по пути час

Edit: что-то вроде этого:

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

+0

и 'file.flush();' после редактирования, если вы не добавляете новую строку уже –

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. 
} 

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

Смежные вопросы