Удалить байты из файла - 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()
исходный файл для чтения (я предполагаю низкоуровневый ввод-вывод, но stdlibf*
функции будут работать аналогично)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-й байт, это то, кем он должен себя вести. Если вы хотите всегда сохранять разделители строк, проще использовать строку за раз функции ввода / вывода