2015-06-04 4 views
7

Я думаю, что это должно быть довольно просто, но мой поиск в Google не помог до сих пор ... Мне нужно написать существующий файл на C++, но не обязательно в конце файла.Как написать в середине файла в C++?

Я знаю, что когда я просто хочу добавить текст в свой файл, я могу передать флаг ios:app при вызове open на свой объект stream. Тем не менее, это только позвольте мне писать до самого конца файла, но не в его середине.

Я сделал короткую программу, чтобы проиллюстрировать этот вопрос:

#include <iostream> 
#include <fstream> 

using namespace std; 

int main() { 

    string path = "../test.csv"; 

    fstream file; 
    file.open(path); // ios::in and ios::out by default 

    const int rows = 100; 
    for (int i = 0; i < rows; i++) { 
    file << i << "\n"; 
    } 

    string line; 
    while (getline(file, line)) { 
    cout << "line: " << line << endl; // here I would like to append more text to certain rows 
    } 


    file.close(); 

} 
+0

Возможно, вы захотите использовать индексированную библиотеку файлов (например, [GDBM] (http://www.gnu.org.ua/software/gdbm/)) или [sqlite] (http://sqlite.org/) , или даже полноценная база данных ([PostgreSQL] (http://postgresql.org/), [MongoDB] (http://mongodb.org/) ....) –

+0

Стандартный способ изменения файлов: чтение ввода файл, процесс, запись в новый выходной файл, когда это удалось, перезаписать входной файл с выходным файлом. Существуют «более быстрые» альтернативы (например, ios :: app), но они не для каждой ситуации. – stefaanv

+5

Разве это уже не спрашивали здесь миллион раз? –

ответ

11

Вы не можете вставить в середине файла. Вы должны скопировать старый файл в новый файл и вставить все, что хотите посередине, во время копирования в новый файл.

В противном случае, если вы намерены перезаписать данные/строки в существующем файле, это возможно с помощью std::ostream::seekp() для определения позиции внутри файла.

+5

Просто чтобы быть полным : Вы не можете _insert_ в середине файла, но вы можете _replace_, такое же количество байтов, путем перезаписи. –

+0

, чтобы продолжить, см. Примерный код; http://stackoverflow.com/questions/2393345/how-to-append-text-to-a-text-file-in-c – Anil

+1

в основном вы можете перемещать указатель файла в любом месте с помощью функции-члена seekp() и запускать письмо. Однако любые записи перед EOF заменяют старые данные. – 911

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