【问题标题】:C in UNIX: Reading/combining files based upon number of bytesUNIX 中的 C:根据字节数读取/组合文件
【发布时间】:2017-02-01 23:49:47
【问题描述】:

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

我尝试更改 1000 in

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]);
    }
  }
} 

【问题讨论】:

  • 我认为这将只涉及在字节数 N 前添加一个“-”这是 可爱(但不正确)。 How do you determine the size of a file in C?
  • 您可能需要fread()fwrite()fseek() 的合适组合
  • 我尝试使用 fread 和 fwrite 但它无法编译。我不明白我做错了什么,但我认为在 fread 和 fwrite.while (fread(buffer, 1, number, file)) { fwrite(buffer, 1,号码,文件); printf("%s", 缓冲区); }

标签: c unix


【解决方案1】:

假设您想要文件的前 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]);
        }
    }
}

这使用了 cmets 中建议的 fread()fwrite()fseek()

它还注意关闭成功打开的文件。它不需要文件的写入权限,因为它只读取而不写入这些文件(在对 fopen() 的调用中使用 "r" 而不是 "r+")。

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

我争论在函数调用中是否使用sizeof(buffer)NUM_BYTES。我认为NUM_BYTES 更好,但选择不是确定的——使用sizeof(buffer) 来代替是有说服力的。

请注意,buffer 成为局部变量。没有必要将它归零;只有fread() 写的条目才会被fwrite() 写,所以bzero() 没有解决问题。 (当变量是全局变量时,没有任何意义;具有静态持续时间的变量默认初始化为所有字节为零。)

错误信息写入标准错误。

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

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

【讨论】:

    猜你喜欢
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 2010-09-05
    • 2012-01-24
    • 2017-07-03
    • 1970-01-01
    相关资源
    最近更新 更多