从文件中删除字节 - c

时间:2013-10-31 19:07:50

标签: c file lseek

如何从文件中删除从i到i的字节。

示例:"today me and my roomates went to a party"; 如果i = 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 个答案:

答案 0 :(得分:2)

如果删除你的意思是从文件的内容中删除字节(在文件的中间),你不能这样做。您必须打开另一个文件并有选择地复制要保留的内容。所以这样做的方式如下:

  • open()用于阅读的源文件(我假设低级I / O但stdlib f*函数的工作方式类似)
  • open()用于撰写的目标文件
  • lseek()到正确的位置
  • read()要保留的部分
  • write()到目标文件
  • 重复最后3次操作直至完成。

请注意,您正在lseek() FILE*上以正确的 方式调用fseek()(请检查您的编译器警告。您应该使用mmap()

另一种方法是{{1}}文件并读取它的部分内容,就好像它是一个数组一样。

最后,如果你的文件是一个简单的字符串,最简单的方法可能是在内存中读取它并将正确的部分复制到输出文件中。

答案 1 :(得分:2)

流版可以是更好的解决方案。然后让用户使用重定向(使用管道,或者根据需要流式传输到终端)。但是,写代替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;
}

答案 2 :(得分:0)

最简单的方法是在I / O调用时使用字符。一定要使用缓冲的I / O流(并使用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个字节,那就是它应该表现。如果要始终保持行分隔符,则在I / O函数

时使用该行更为简单