495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
|
||||||
1 | ||||||
Удалить строку из файла манипуляторами потока27.05.2017, 18:46. Показов 1336. Ответов 15
Метки нет (Все метки)
Задача вроде проста - удалить из очень большого текстового файла строку, допустим последнюю. Так как в первую очередь надо обеспечить максимальную скорость/эффективность, то я решил воспользоваться простыми манипуляторами потока чтения/записи. Но как удалить саму строку из файла? Как обрезать часть файла с определенной позиции?
0
|
27.05.2017, 18:46 | |
Ответы с готовыми решениями:
15
Удалить строку из файла. Вставить строку из файла Удалить строку из файла Удалить строку из файла Удалить строку из файла |
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
|
|
28.05.2017, 01:24 | 5 |
Почему бы не использовать HEX редактор для этого? или IPS-патчер
там можно прописать скрипты и другие плюшки
0
|
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
|
|
28.05.2017, 01:37 | 7 |
Если вы имеете ввиду удалить N последних/первых строк
то нужно просто при считывани N первых считать, остальные проигнорировать или подсчитать кол-во строк в файле допустим M а потом просто проигнорировать M-N первых строк, а остальные N считать и записать Добавлено через 5 минут С помощью обычной резалки-склейки файлов, можно реализовать реверс файла т.е. поделить на строки, а потом склеить в обратном порядке, хотя тоже самое сделает и С++ но медленне как мне кажется, потому как в первых явно продуманное приложение (может работать и на ассемблере)
0
|
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
|
|
28.05.2017, 01:54 | 9 |
жаль, ведь некоторые языки могут поддерживать такую функцию вроде как PHP было
Добавлено через 2 минуты Например можно попробовать вшить скрипт PHP выполнения в библиотечку А из С++ уже запускать эту библиотечку, которая будет имитировать работу скрипта конечно у тебя могут спросит как уже реализована библиотека, и тут проблема Добавлено через 1 минуту В случае если файл очень большой, то он обычно бъется по кластерам или секторам в зависимости с чем быстрее работает железо, уже не вспомню Добавлено через 47 секунд А если скорость не важна, то можно бить по 2Гб Добавлено через 9 минут Чтобы избежать загрузки в память строк, которые всё равно будут проигнорированы и чтобы поддерживать произвольно большие входные строки, можно читать файл побайтно, используя fgetc(). Чтобы пропустить строки до тех пор пока не встретится строка, которая начинается с цифры (строка с численными данными), игнорируя возможные пробелы, можно использовать автомат с двумя состояниями: 1) читаем до тех пор пока не прочитан символ новой строки ('\n') 2) переходим в состояние ожидания цифры (expect_digit=1): все пробелы и табы игнорируются, если прочитана цифра, то возвращаем её назад в поток и выходим из функции, в противном случае (не цифра) возвращаемся в начальное состояние 1. Аналогично и для позиции, можно считывая до endl и считать количество считываемых символов (что бы не вызывать много раз функцию считывания строки)
0
|
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
|
|
28.05.2017, 01:56 | 10 |
notAll, манипуляторы потока не дадут тебе выкинуть кусок файла. Непосредственно управлением файловой системы можно переписать расположение кусков файла на диске, но очень не уверен что это можно сделать для единичной строки (например у FAT32 можно манипулировать кусочками по 512 байт, а у NTFS - вовсе кусками не менее 8 МБ). Так что если у тебя строка окажется не кратной указанным длинам, или находиться в двух смежных секторах/томах, то удалить её не получится. И надо будет как минимум считать весь хвост файла и перезаписать его начиная с того места, где начиналась строка.
0
|
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
|
|
28.05.2017, 02:00 | 11 |
А можно посмотреть реализацию этих функций и самому написать похожие, но работающие уже без вызова
Так сказать ты их встроишь и обрежешь ненужный для тебя функционал Добавлено через 2 минуты вот вот, правильно говорит, т.е. максимум что ты сможешь сделать реально БЫСТРО так это реверс этих блоков и чисто теоретически предположить, в каком блоке у тебя данные, а потом их считать
0
|
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
|
|
28.05.2017, 02:56 | 12 |
Что по этому сообщению можно понять? Ни кода, ни что делал, ничего... Что хочешь - то и думай...
Встроенных способов для решения такой задачи, кроме перезаписи текстового файла, в С++ нет.
0
|
838 / 641 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
|
|
28.05.2017, 04:56 | 13 |
Если для винды, то это легко решается WinAPI функцией SetEndOfFile, а установка позиции SetFilePointer/SetFilePointerEx
0
|
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
|
||||||
28.05.2017, 13:17 [ТС] | 14 | |||||
Ну ясно.
Вот что нашел - int truncate(const char *, off_t); из unistd.h . Вроде отрезает корректно:
0
|
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
|
|
28.05.2017, 15:44 | 16 |
Стандарт, но не С++, а POSIX.
0
|
28.05.2017, 15:44 | |
28.05.2017, 15:44 | |
Помогаю со студенческими работами здесь
16
Удалить строку из файла Удалить из файла строку Удалить из файла строку с номером k Удалить нужную строку из файла Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |