Я пытаюсь запустить программу для замены определенных данных в файле. Соответствующие части файла, пытающиеся заменить, выглядят следующим образом:C++ перезапись данных файла?
1 Information 15e+10
2 Information 2e+16
3 Information 6e+2
И так далее.
Эти файлы могут быть очень большими в диапазоне нескольких гигабайт и, насколько мне известно, из-за этого с использованием буфера всего файла и перезаписи всего файла невозможно/необоснованно. Ну, это нормально, я просто хочу заменить значения (например, 15e+10
).
Это все работает отлично с простой ios::in|ios::out
и tellp()
если я заменить значение с аналогичным размером значением (15e+10
->12e+12
) или даже если его меньшего размером, как я могу просто добавить дополнительное пространство, которое может быть проигнорировано вниз линия (например, 15e+10
->4e+10
). Но я столкнулся с проблемой, если мне нужно заменить значение значением, длина которого больше, чем уже в файле (например, 6e+2
->16e+10
), он будет писать поверх нового символа строки или начинать писать информацию в следующая строка.
Я искал на форумах, и все говорят, что вы можете либо перезаписать в файле, либо добавить в конец файла, либо вы можете буферизировать и воссоздать весь файл. В любом случае, я могу достичь своей цели правильно записать значение, не создавая файл?
Если нет, то как я могу открыть 2 файла (1 вход 1 выход), если несколько файлов, о которых идет речь, слишком велики для памяти?
Примечание: Я хотел бы также, чтобы избежать использования boost::
как мне нужно, чтобы иметь возможность запускать это на систему без повышающих библиотеки.
Вам не нужно иметь весь файл в память. Вам нужно только иметь одну запись в памяти в любой момент времени. Однако использование записей переменной длины, которые необходимо обновить на месте для файлов такого размера, в значительной степени гарантируется как кошмар производительности. Записи с фиксированной длиной были бы самым простым решением. –
Не использование текстовых файлов размером в несколько гигабайт может быть другим вариантом. –
Что именно вы имеете в виду, мне нужна только 1 запись в памяти за раз? Я считал (легко ошибаюсь), что наличие открытого файла означало, что информация, которую вы читали на нем, в любом выбранном методе, была сохранена в памяти, а наличие второго файла, открытого для записи, сделало бы это в два раза больше места. Это определенно отвечает на мой вопрос, если это не так, и единственная часть, хранящаяся в памяти, - это то, что было прочитано, в котором должна быть только строка за раз. И Fixed-Length было бы неплохо, но со значительными вариациями (более чем на примере) в то время было бы разумнее выбирать нет. – JCline