UNIX中的C:根据字节数读取/组合文件

时间:2017-02-01 23:49:48

标签: c unix

我正在尝试修复下面的代码,只读取前几个N字节。我也想做同样的事情,但对于N个字节的最后一个数字(我假设只涉及在字节数N前面添加' - ')。我不确定使用fget是否是正确的方法。

我尝试更改

中的1000
while(fgets(buffer, 1000, fp)

但我不认为更改该值会获取一定数量的字节,因为我已经读过它只是一个最大值。

char buffer[1001];

int main(int argc, char** argv) {
  bzero(buffer, sizeof(buffer));
  for(int x=1; x<argc; x++) {
    FILE *fp = fopen(argv[x], "r+");
    if (fp) {
      while(fgets(buffer, 1000, fp)) {
        printf("%s", buffer);
      }
    } else {
      printf("could not open file %s\n", argv[x]);
    }
  }
} 

1 个答案:

答案 0 :(得分:0)

假设您想要文件的前1000个字节和最后1000个字节,并且在很大程度上忽略了小于2000字节的文件的问题(它可以工作,但您可能需要不同的结果),您可以使用:

#include <stdio.h>

enum { NUM_BYTES = 1000 };

int main(int argc, char **argv)
{
    for (int x = 1; x < argc; x++)
    {
        FILE *fp = fopen(argv[x], "r");
        if (fp)
        {
            char buffer[NUM_BYTES];
            int nbytes = fread(buffer, 1, NUM_BYTES, fp);
            fwrite(buffer, 1, nbytes, stdout);
            if (fseek(fp, -NUM_BYTES, SEEK_END) == 0)
            {
                nbytes = fread(buffer, 1, NUM_BYTES, fp);
                fwrite(buffer, 1, nbytes, stdout);
            }
            fclose(fp);
        }
        else
        {
            fprintf(stderr, "%s: could not open file %s\n", argv[0], argv[x]);
        }
    }
}

这会根据评论中的建议使用fread()fwrite()fseek()

关闭成功打开的文件也很小心。它不要求对文件的写入权限,因为它只读取并且不写入这些文件(在"r"的调用中使用"r+"而不是fopen()

如果文件小于1000字节,fseek()将失败,因为它试图寻找负偏移。如果发生这种情况,请不要再读取或写入另外1000个字节。

我在函数调用中讨论了是否使用sizeof(buffer)NUM_BYTES。我认为NUM_BYTES更好,但选择不是确定的 - 有使用sizeof(buffer)的有力论据。

请注意buffer成为局部变量。没有必要把它归零;只有fread()写入的条目才会由fwrite()撰写,因此bzero()无法解决问题。 (当变量是全局变量时,并没有任何重点;静态持续时间的变量默认初始化为所有字节为零。)

错误消息将写入标准错误。

代码不检查零字节读取;可以说,它应该。

如果NUM_BYTES成为参数(例如,您调用程序fl19并使用fl19 -n 200 file1打印file1的第一个和最后200个字节),那么您需要做一些整理以及命令行参数处理。