Удалите Строку из файла на языке C

Я обратился к следующему в вырожденном случае, где это - просто AND's или OR's.

if all( [cond1 == 'val1', cond2 == 'val2', cond3 == 'val3', cond4 == 'val4'] ):

if any( [cond1 == 'val1', cond2 == 'val2', cond3 == 'val3', cond4 == 'val4'] ):

Это бреет несколько символов и проясняет, что нет никакой тонкости к условию.

16
задан Brian Tompsett - 汤莱恩 3 July 2015 в 19:34
поделиться

2 ответа

Проблема в том, что файл (по сути) представляет собой массив байтов на диске (или любой другой физической подложке, но, в любом случае, байтов!), А «строка» может занимать разное количество байты; поэтому для вставки или удаления строк (если только вы не всегда строго заменяете строку другой строкой точно такой же длины в байтах) потребуется «сдвиг» всего остального файла «вверх» или «вниз» на разницу в байтах. ... что может быть чрезвычайно обременительной операцией (так как остальная часть файла может быть гигабайтами, даже если вы просто изменяете длину одной строки на 1 байт в сторону начала файла).

Таким образом, такие операции могут быть невероятно обременительны и поэтому обычно никогда не предлагаются в качестве примитивов в ЛЮБОМ языке, поддерживающем файлы с переменной длиной строки (C, Python, Java, C ++, Ruby, или ЛЮБОЙ другой такой язык). Крайне маловероятно, что вам действительно придется платить такую ​​потенциально неограниченную стоимость производительностью и рисками (сбой системы или диска во время «сдвига» ГБ или данных вверх или вниз может нарушить удобство использования всего вашего огромного файла), когда Совершенно простой, адекватный, быстрый, безопасный и разумный метод, которого вы пытаетесь избежать, практически не имеет недостатков (так что это далеко не очевидно, ПОЧЕМУ вы пытаетесь этого избежать?).

Используйте файл результатов, отличный от исходного. -file, когда это сделано, переместите файл результата поверх исходного файла (атомарная операция в большинстве систем, если вы находитесь в одной файловой системе), и вы действительно получаете лучшее из всех возможных миров.

28
ответ дан 30 November 2019 в 17:39
поделиться

Вы не можете легко "вырезать" часть файла на месте. Вы всегда где-нибудь делаете временную копию. Это не C; это верно для любого языка.

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

3
ответ дан 30 November 2019 в 17:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: