Удалить байты из файла - c

Как я могу удалить из файла байты от i до i.

Пример: "today me and my roomates went to a party";если я = 3, я хочу удалить 3-й байт, 6-й, 9-й... и т. д. Я пытался использовать lseek и fgets, но я не знал, как это сделать.

Что я пробовал:

FILE* f = fopen(name_file,"r");
lseek(f,0,SEEK_SET);
while(fgets(lune,255,f) != NULL){
     lseek(f,i,SEEK_SET);
}

Я не слишком много делал, потому что не знаю точно, что делать. Может быть, вы можете помочь мне с некоторыми ответами и советами.

3 ответа

Если под удалением вы подразумеваете физическое удаление байтов из содержимого файла (в середине файла), вы не можете этого сделать. Вы должны открыть другой файл и выборочно скопировать содержимое, которое вы хотите сохранить в нем. Итак, способ сделать это следующим образом:

  • open() исходный файл для чтения (я предполагаю низкоуровневый ввод-вывод, но stdlib f* функции будут работать аналогично)
  • open() файл назначения для записи
  • lseek() в правильное место
  • read() часть, чтобы сохранить
  • write() в файл назначения
  • повторите последние 3 операции, пока не будет сделано.

Обратите внимание, что вы звоните lseek() на FILE* это не правильный путь (проверьте предупреждения компилятора. Вы должны использовать fseek()

Еще один способ будет mmap() файл и читать его части, как если бы это был массив.

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

Потоковая версия может быть лучшим решением. И затем для пользователей, чтобы использовать перенаправление (используя каналы или поток к терминалу, если они хотят.). Хотя, вместо записи putchar() было бы, конечно, просто реализовать.

#include <stdio.h>

void usage(char *myname)
{
    fprintf(stderr, "Usage: %s <file>\n", myname);
}

int main(int argc, char *argv[])
{
    FILE *fh;
    char *fn;
    int c;
    int i;
    int m = 3;

    if (argc != 2) {
        usage(argv[0]);
        return 1;
    }
    fn = argv[1];

    if (!(fh = fopen(fn, "r"))) {
        perror(fn);
        return 2;
    }

    i = 0;
    while ((c = fgetc(fh)) != EOF)
        if ((++i % m))
            putchar(c);

    return 0;
}

Простейшим является использование символа во время вызовов ввода / вывода. Обязательно используйте буферизованные потоки ввода / вывода (и используйте setvbuf()), чтобы избежать действительно плохой производительности

FILE *f, *fout;
f = fopen(...);
foutp = fopen(...);

int i = 3, c, ii;

for (ii = 1; c = (getc(f)) != EOF; ++ii)
{
  if (ii % i == 0) 
  {
     putc(outf);
  }
}
fclose(f); 
fclose(fout);

Конечно, вам может понадобиться удалить исходный файл и переименовать вывод обратно в исходное имя файла после того, как вы скопировали каждый третий символ.

ADDED

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

Другие вопросы по тегам