2015-06-25 2 views
2

Есть ли какой-нибудь «быстрый» способ редактировать первую строку большого файла (~ 100Mg) на C++?Редактировать первую строку огромного файла в C++

Я знаю, что мы можем читать файл по строкам, вносить изменения, записывать его во временный файл и переименовывать временный файл. Но мне интересно, есть ли более быстрый способ сделать это (что-то вроде модификации на месте)?

+1

Если новая линия и старая линия имеют тот же размер, вы можете это сделать. Если нет, это невозможно. –

+1

Btw., Эта проблема не связана с C++. Java или любой другой язык вам не помогут. – deviantfan

+1

Если новая строка короче старой строки, она может быть дополнена пробелами. –

ответ

2

Возможно, вы можете использовать методы манипуляции с файлами /fprintf, чтобы иметь возможность записывать файл в зависимости от позиции указателя файла.

Вы открываете файл с fopen для добавления, используйте fseek в начале и напишите, что вам нужно. Однако вы должны быть осторожны с длиной первой строки. Если вы пишете меньше оригинальной строки, вы все равно оставите лишний контент. Если вы напишете больше, вы перепишете свой другой контент.

+1

Если длина строки изменяется, вы можете перенести другое содержимое в файл вперед или назад в том же файле с последовательностью перегибов 'fseek()' вызовов между чтением и записью. Это может привести к временному сокращению времени хранения большого файла.Однако, если ваш сдвиг прерывается (например, процесс умирает), файл может быть оставлен в промежуточном, поврежденном состоянии. Я использовал этот подход для добавления заголовка после создания нового файла, который может быть выброшен, если запись будет прервана. –

+0

@MiltoxBeyond, что бы вы подумали о том, чтобы сделать «mmap» только в первой строке файла, а затем записать в указатель? – Alejandro

2

100MB не так уж и много на современных компьютерах. Если это одноразовая сделка, и вы не работаете на действительно медленном устройстве, вы можете просто прочитать весь файл, разделить его на строки, сделать свое редактирование и записать все это в одно мгновение.

Если это будет происходить чаще, вы можете просто добавить некоторые пробелы в первую строку (если возможно), чтобы создать «буфер» для вещей, которые вы можете поместить там в следующий раз. Затем вы можете использовать fwrite для перезаписи только этой первой строки, не касаясь остальной части файла.

Могут существовать конкретные способы использования ОС и файловой системы для размещения дополнительного пространства внутри существующего файла без перемещения данных. Например, на Linux с XFS/ext4 вы можете использовать fallocate:

int fallocate(int fd, int mode, off_t offset, off_t len); 

fallocate() позволяет вызывающего напрямую управлять выделенным дисковым пространством для файла, указанного Ф.Д. для диапазона байт, начиная со смещением и продолжение для len-байтов.

0

Вы думаете о memory-mapped file, в котором весь файл «отображается» в памяти, но на самом деле не загружен или переписан, пока не пытаться получить доступ или изменить его часть. В системах POSIX вы можете указать mmap() часть файла (скажем, первый килобайт), изменить его по мере необходимости, а затем использовать msync() для записи только этой части памяти обратно на диск.

1

Я считаю, что самый быстрый способ выполнить вашу задачу - создать новый файл, содержащий первое значение строки. Всякий раз, когда вы берете запрос на чтение файла, сначала читаете файл с первой строкой, затем читаете больший файл, пропуская первую строку, которая фактически хранится в большем файле. Всякий раз, когда вы хотите изменить первую строку, просто измените файл первой строки.

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