2012-02-07 159 views
14

嗨,在我的项目中,我必须读取一个.bin文件,其中包含short(16 bit values)形式的传感器数据。我正在使用fread函数将其写入缓冲区,但我觉得读入不正确。我的意思是在我写的和我读到的内容之间没有一致性。你们可以建议这里出了什么问题吗?这不是我的项目中的代码...我只是试图在这里验证freadfwrite函数。如何使用fread和fwrite函数读取和写入二进制文件?

#include<stdio.h> 
void main() 
{ 
    FILE *fp = NULL; 

    short x[10] = {1,2,3,4,5,6,5000,6,-10,11}; 
    short result[10]; 

    fp=fopen("c:\\temp.bin", "wb"); 

    if(fp != NULL) 
    { 
     fwrite(x, 2 /*sizeof(short)*/, 10 /*20/2*/, fp); 
     rewind(fp); 
     fread(result, 2 /*sizeof(short)*/, 10 /*20/2*/, fp); 
    } 
    else 
     exit(0); 

    printf("\nResult"); 
    printf("\n%d",result[0]); 
    printf("\n%d",result[1]); 
    printf("\n%d",result[2]); 
    printf("\n%d",result[3]); 
    printf("\n%d",result[4]); 
    printf("\n%d",result[5]); 
    printf("\n%d",result[6]); 
    printf("\n%d",result[7]); 
    printf("\n%d",result[8]); 
    printf("\n%d",result[9]); 

    fclose(fp) 
} 

后,我做了FREAD()(十六进制值):

temp.bin: 
01 02 03 04 05 06 e1 8e 88 06 ef bf b6 0b... 

后,我做

stdout: 
Result 
0 
914 
-28 
-28714 
-32557 
1 
512 
-32557 
908 
914 
+0

你尝试过关闭然后重新打开该文件?如果您写入文件并立即读取,我不确定文件的内容。您可能必须先关闭它才能确保数据被刷新?另外,请确保打开它以便第二次读取... – aardvarkk 2012-02-07 16:35:17

回答

12

用模式w+(读写)打开文件。下面的代码工作:

#include<stdio.h> 
int main() 
{ 
    FILE *fp = NULL; 

    short x[10] = {1,2,3,4,5,6,5000,6,-10,11}; 
    short result[10]; 
    int i; 

    fp=fopen("temp.bin", "w+"); 

    if(fp != NULL) 
    { 
     fwrite(x, sizeof(short), 10 /*20/2*/, fp); 
     rewind(fp); 
     fread(result, sizeof(short), 10 /*20/2*/, fp); 
    } 
    else 
     return 1; 

    printf("Result\n"); 
    for (i = 0; i < 10; i++) 
     printf("%d = %d\n", i, (int)result[i]); 

    fclose(fp); 
    return 0; 
} 

随着输出:

Result 
0 = 1 
1 = 2 
2 = 3 
3 = 4 
4 = 5 
5 = 6 
6 = 5000 
7 = 6 
8 = -10 
9 = 11 
+0

@ RichardJ.RossIII在我的答案中有几处更正。 – trojanfoe 2012-02-07 17:27:05

3

当你打开文件,你忘了允许和fwrite()阅读:

fp=fopen("c:\\temp.bin", "wb"); 

应该是:

fp=fopen("c:\\temp.bin", "w+b"); 
+2

模式'rwb'不被识别。我认为你的意思是'w + b'或'wb +'。 – pmg 2012-02-07 16:42:13

+0

@pmg'rwb'适用于我,Mac OSX Lion上的gcc。 – 2012-02-07 16:43:00

+2

@理查德:这不是标准。 [见这里](http://port70.net/~nsz/c/c99/n1256.html#7.19.5.3)或[在本PDF中](http://www.open-std.org/JTC1/sc22 /wg14/www/docs/n1256.pdf)。 – pmg 2012-02-07 16:44:20

相关问题