【问题标题】:Reading a range of bytes from a file in C从C中的文件中读取一系列字节
【发布时间】:2021-12-26 17:07:48
【问题描述】:

我正在尝试编写一个程序,该程序接受一个文件,并以不同的间隔从中读取字节,并将它们分配给一个变量。 这是我目前拥有的:

struct casc_file_parsed {
    unsigned int targetsize;
    uint64_t blocksize;
    uint64_t blockcount;
    csc_block_t* blocks;
};
struct casc_file_parsed parsed_casc_file;
FILE* fpc = fopen(casc_file_data, "r");

char c;
char str[MAX];
int i = 0;
int j = 0;

for(i = 0; i >= 24; i++) {
    if(i >= 16 && i <= 24) {    
        str[j] = c;
        j++;
    }
    c = fgetc(fp);
}
parsed_casc_file.targetsize = str;

我还没有测试它,因为我知道它还没有完成,需要添加其他功能才能运行。我在这种方法中试图做的是创建一个循环,如果 I 是 16-24 的间隔,它将当前字节保存到数组 str 中。然后需要将数组转换为 int,并保存在结构中(我知道底线不起作用)。 我不确定这是否是最好的方法,但如果有更好的方法或者我遗漏了什么,我现在真的可以使用一些输入。

编辑: .cascade 文件是一个 64 字节的文件,包含描述另一个文件的哈希列表。该文件中的 16-24 字节,包含原始文件的文件长度,为网络字节序的无符号整数。

【问题讨论】:

  • 以文本模式(“r”)打开文件看起来很可疑。
  • @Passerby 我不确定你所说的可疑是什么意思,但我想我只需要从中阅读,而不是写任何东西。当我想到它时,我实际上可能不得不使用 rb。
  • 我希望看到使用fseek()fread() 的代码,而不是使用fgetc() 进行迭代。 64 字节的文件无关紧要。如果起始偏移量很小,则无关紧要,但是如果文件是 64 MiB 并且起始偏移量是大约 10 兆字节,则会有很大的不同。
  • 如果您只处理总共 64 字节的文件,只需分配一个 64 字节的缓冲区,然后用一个 fread() 将整个文件读入内存。之后根据需要摆弄字节数组。
  • for(i = 0; i &gt;= 24; i++) 根本不循环,因为0 &gt;= 24 是假的。

标签: c loops networking byte cascade


【解决方案1】:

你可能需要这样的东西:

  ...
  FILE* fpc = fopen(casc_file_data, "rb");  // use "rb" just to be sure you're reading
                                            // binary. It's mandatory on some platforms

  fseek(fpc, 16, SEEK_SET);        // goto offset 16
  char buffer[8];                  
  fread(buffer, 8, 1, fpc);        // read 8 bytes (which are a 64 bit integer)

  uint64_t rawsize;
  memcpy(&rawsize, buffer, 8);     // copy bytes read to 64 bit variable

  unsigned int targetsize = (unsigned int)rawsize;  // convert to unsigned int
  ...
  fclose(fpc);

免责声明:

  • 我想偏移量 16 到 24 的 8 个字节实际上是一个 64 位的数字
  • 您可能需要与endiannes打交道。
  • 在此示例中没有任何错误检查。

【讨论】:

    猜你喜欢
    • 2020-09-05
    • 1970-01-01
    • 2012-10-05
    • 2023-03-20
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多