@warchant
Пишу всё на всём

Как изменить строку в файле?

Предположим есть *.txt файл, который содержит в каждой строке
Имя|Фамилия
Предположим, что размер всего файла намного больше количества оперативной памяти (весь файл считать в память не сможем). Эдакое подобие базы данных.

Мне необходимо изменить (!) одну строку из середины файла. Предположим, я нашел эту строку и курсор находится в её начале. Вопрос в том, с помощью каких инструментов в С++ я могу изменить эту строку без перезаписи всего файла.

Возможно ли заменить/удалить n байт из середины файла без перезаписи всего файла в С++? Как это сделать?

UPD: То есть для того, чтобы изменить 1 байт в середине файла мне придется перезаписать его весь? :\
  • Вопрос задан
  • 9392 просмотра
Решения вопроса 1
AtomKrieg
@AtomKrieg
Давай я поищу в Google за тебя
Замена делается вот так:
ofstream f("text.txt");
	f.write("abcde",5);
	f.close();

	f.open("text.txt", ofstream::binary | ofstream::out | ofstream::in);
	f.seekp(1);
	f.write("zxc",3);

Добавить и удалить байты без перезаписи файла нельзя, считайте что они располагаются подряд, когда вы удаляете, все позадистоящие байты сдвигаются влево. Если очень хочется совсем без перезаписи, зафиксируйте размеры строк для имени и фамилии - в бд так и делается.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
GavriKos
@GavriKos
Без перезаписи - никак. Не работает IO так.
Ответ написан
@0LLEGator
"Начинающий" программист в средней компании.
Вопрос о том, как удалить гланды per anus. Можно НО ЗАЧЕМ? (так извращаться)
По теме - непосредственная низкоуровневая работа с диском.
Ответ написан
Комментировать
@MiiNiPaa
Заменить n байт в середине файла вполне возможно.
Добавить/удалить без перезаписи — никак.
Ответ написан
Adamos
@Adamos
Предположим, вы написали программу, которая докапывается до кластеров и заменяет байты прямой записью на диск.
Теперь представьте:
- что у пользователя нет админских прав, и хрен система позволит ему напрямую обращаться к диску;
- что программа запущена под Wine, и подобные функции вызвать невозможно
- что за время существования вашей программы разработаны другие файловые системы, и хранение файлов в них иное
- что файл сжат на диске средствами Виндов
- что файл лежит не на локальном диске, а на подключенном сетевом ресурсе
- ...
Вам все еще хочется идти глубже?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы