2015-05-08 118 views
0

我试图打开一个二进制文件并读取一个类的任务内容。即使在进行研究之后,我在尝试打开并打印二进制文件的内容时遇到了任何问题。我甚至不知道我应该得到什么,如何检查它是正确的,但我知道没有任何东西(这是我目前得到的)是不好的。下面是我从这个网站在C中打开二进制文件

#include<stdio.h> 

int main() 
{ 
    FILE *ptr_myfile; 
    char buf[8]; 

    ptr_myfile = fopen("packets.1","rb"); 
    if (!ptr_myfile) 
    { 
     printf("Unable to open file!"); 
     return 1; 
    } 

    fread(buf, 1, 8, ptr_myfile); 

    printf("First Character: %c", buf[0]); 

    fclose(ptr_myfile); 
    return 0; 
} 

当此打印,我得到了搜索代码“第一个字符:”没有别的印刷。也许它不能在终端中正常打印?我不知道,任何帮助将不胜感激,谢谢

+0

看来你正确地调用它。用文本文件尝试一下。 –

+1

如果您使用十六进制编辑器查看您想要读取的文件,它会显示第一个字符。或者你可以打印字符的值,而不是试图将其转换为字符,只是为了检查它 - 它可能是一个空白字符。请注意,如果您使用以Unicode编码的文本文件,则文件的开头可能会有一个字节顺序标记。 –

回答

2

如果它是一个二进制文件,它很可能是它的内容不打印特别好文本(这是什么使得一个二进制的二进制文件)。除了打印为字符尝试打印为十六进制数字:

#include <stdio.h> 
#include <stddef.h> 
#include <stdlib.h> 

int main() 
{ 
    FILE *ptr_myfile; 
    char buf[8]; 

    ptr_myfile = fopen("packets.1","rb"); 
    if (!ptr_myfile) 
    { 
     printf("Unable to open file!"); 
     return 1; 
    } 

    size_t rb; 
    do { 
     rb = fread(buf, 1, 8, ptr_myfile); 
     if(rb) { 
      size_t i; 
      for(i = 0; i < rb; ++i) { 
        printf("%02x", (unsigned int)buf[i]); 
      } 
      printf("\n"); 
     } 
    } while(rb); 

    fclose(ptr_myfile); 
    return 0; 
} 
2

首先,你需要检查你有多少数据在缓冲区中。 fread返回长度;如果它为零,则访问buf[0]是不合法的。

并非所有的字符是可以打印你可以看到你做了什么数据,如果你打印的字符代码c,而不是c本身。为此,请使用%d

size_t len = fread(buf, 1, 8, ptr_myfile); 
if (len != 0) { 
    printf("First Character: '%c', code %d", buf[0], buf[0]); 
} else { 
    printf("The file has no data\n"); 
}