【发布时间】:2016-09-26 08:09:37
【问题描述】:
基本上,我正在尝试使用 fread() 读取文件的二进制数据并使用 printf() 将其打印在屏幕上,现在,问题是当它打印出来时,它实际上并没有显示为二进制 1 和 0,但打印符号和我不知道它们是什么的东西。
这就是我的做法:
#include <stdio.h>
#include <windows.h>
int main(){
size_t sizeForB, sizeForT;
char ForBinary[BUFSIZ], ForText[BUFSIZ];
char RFB [] = "C:\\users\\(Unknown)\\Desktop\\hi.mp4" ; // Step 1
FILE *ReadBFrom = fopen(RFB , "rb" );
if(ReadBFrom == NULL){
printf("Following File were Not found: %s", RFB);
return -1;
} else {
printf("Following File were found: %s\n", RFB); // Step 2
while(sizeForB = fread(ForBinary, 1, BUFSIZ, ReadBFrom)){ // Step 1
printf("%s", ForBinary);
}
fclose(ReadBFrom);
}
return 0;
}
如果有人能帮助我将文件的实际二进制数据读取为二进制 (0,1),我将不胜感激。
【问题讨论】:
-
以“二进制模式”打开文件只是意味着当您从中读取时,您将获得未经特殊处理的原始数据。如果你输出它,它会按原样输出,看起来像垃圾。如果您希望它输出为 0 和 1,则需要编写一些代码来执行此操作。
-
@Wajid 您正在正确地将其读取为二进制文件。问题是 C/C++ 中没有二进制原始数据类型,因此它通常存储为字符(每个字符 8 位)。您告诉运行时打印二进制数据,就好像它是一个字符串一样,所以您得到了符号,因为这恰好是您正在打印的二进制数据的字符串表示形式。看到这个:Convert binary to string
-
如果你想把工作做好,你必须自己做。
printf没有以二进制输出的转换说明符。所以你必须编写一个嵌套循环,其中外循环从缓冲区中获取一个字符,内循环转换字符并将其输出为二进制。 -
您不是在尝试编写二进制文件。您对
printf的说明符表示您正在向它传递一个字符串,但事实并非如此。当您告诉它您正在传递一件事然后传递完全不同的内容时,如果事情没有按预期进行,请不要感到惊讶。 Printf 无法提前判断您所传递的内容是不同的。它必须信任您作为开发者才能真正传递您说过要传递的内容,而您并没有诚实传递该内容。 -
您想要一个好的 C 或 C++ 答案吗?