fread获取更多的字符比我在c中问的同时使用二进制文件

问题描述:

我是C的初学者,在我的实习中,我必须使用二进制文件,我必须读取二进制文件中的信息,一时间,fread获取更多的字符比我在c中问的同时使用二进制文件

int main() 
{ 
FILE *ptr=fopen("C:\\Users\\Workstation\\Desktop\\TEST.MAILO","rb"); 

char header[65]; 
char CRLF[3]; 
char first40[41]; 
char rio[33]; 
char date_capture[9]; 


if (ptr==NULL){ 
    printf("Erreur"); 
exit(EXIT_FAILURE); 
} 

fread(header, sizeof(char), 64, ptr); 
fread(CRLF, sizeof(char), 2, ptr); 
fread(first40,sizeof(char),40,ptr); 
fread(rio,sizeof(char),32,ptr); 
fread(date_capture,sizeof(char),8,ptr); 

printf("%s%s",header,CRLF); 
printf("%s|||%s|||",first40,rio); 
printf("%s||",date_capture); 

return 0; 
} 

的问题是,在最后一个变量 “date_capture” 我问8chars的日期,但它得到超过8

EIMG05050120170609007MADIMC0500014 0310000032050810011010358897200120007780 ||| 007MAD00901020170609000109259941 ||| 20170608 ■007MAD00901020170609000109259941 ||

它应该只打印20170608而不打印其他■007MAD00901020170609000109259941 || 请帮我看看到处我还没有发现任何问题。 THANK YOU

+0

在''fread(date_capture,sizeof(char),8,ptr);''add'' date_capture [8 + 1] ='\ 0' ;'' – Neil

+0

'fread()'不知道传递给它的参数的性质,它将它视为'void *'。它知道的只是读取文件中指定的一些字节并将它们写入缓冲区。 – WhiteSword

+0

所以,显然假设它会将一个空字符添加到你的char数组中是不对的。你也应该检查它的文档。 – WhiteSword

fread不会空结束传递给它的缓冲区,你看到多余的字符作为date_capture数据没有空值终止的,你应该叫memset事先设定date_capture为全零到它传递给FREAD

+1

fread文档:'The返回成功读取的元素总数“,因此可以很容易地在正确的位置添加NUL来终止缓冲区中的TEXT字符串。 –

它没有超过8个字节的文件。 fread不会将任何字符串终止符添加到您的缓冲区。尝试自己添加或初始化您的缓冲区全部为0.

+1

fread docs:'成功读取的元素总数被返回',所以很容易在正确的位置添加NUL以终止缓冲区中的TEXT字符串。 –