在二进制文件中计算32位数字的数量

3
我正在制作一个程序,需要追踪二进制文件中有多少个32位的数字。
例如,当输入总共有4x32位的文件时: 01001001010010010010100101001011010010001001010010010010100101000101010001001001010010010001000101001010010001001001001000000000
它应该打印出4。
我使用了getc这个方法,但它没有起作用。
我认为解决方案与fread有关,但我不确定如何在此问题中确切地使用它。
int main() {
    FILE *fp = fopen("/home/pavlos55/GitRepo/arm11_1415_testsuite/test_cases", "rb");
    uint32_t number;
    uint32_t lines = 0;

    while (fread(&number, 4, 1, fp)) {
        lines++;
    }
    printf("%i", lines);
    return 0;
}
< p > fread 可以在条件中吗?为什么这不够?< /p > < p > 谢谢任何帮助。 < /p >

你是在计算单词还是字节?如果你是在计算字节,正如你所说的那样,答案应该是16而不是4。 - DoxyLover
这串零和一的代码是否实际上是您输入文件中的内容?我的意思是,当您打开文本编辑器时,看到的是否是它? - Eugene Sh.
@DoxyLover,实际上我在问题中犯了一个错误,我不是在计算字节,而是在计算双字(32位)。 - pavlos163
@EugeneSh,二进制文件在我的文本编辑器中无法打开,但这正是我对二进制文件的期望。这样做有问题吗? - pavlos163
为什么不直接将文件大小除以4呢? - Lee Daniel Crocker
显示剩余3条评论
2个回答

4

一种更实用的解决方案是使用fseek()将文件指针定位到文件末尾,然后使用ftell()获取结果位置。这将是“文件大小(以字节为单位)”。


2
您将fread()的第三个和第四个参数交换了:使用uint32_t,您可以读取4个大小为1的元素,而不是1个大小为4的元素。这对于理解fread()返回的内容非常重要:实际读取的元素数量 - 这就是您需要添加到lines中的内容。下面是一个可行的版本:
#include <stdio.h>
#include <stdint.h>

int main() {
    FILE *fp = fopen("test.c", "rb");
    uint32_t number;
    uint32_t lines = 0;
    size_t bytes_read;

    while ((bytes_read = fread(&number, 1, 4, fp))) {
        lines += bytes_read;
    }

    printf("%i\n", lines);
    return 0;
}
更新: 要计算32位数字的数量,在循环之后,将lines除以4即可:
lines /= 4;
printf("%i\n", lines);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接