2012-02-07 28 views
14

Xin chào trong dự án của tôi Tôi đã đọc tệp .bin có dữ liệu cảm biến ở dạng short(16 bit values). Tôi đang làm điều này bằng cách sử dụng chức năng fread vào bộ đệm, nhưng tôi cảm thấy rằng việc đọc không diễn ra chính xác. Tôi có nghĩa là không có sự nhất quán giữa những gì tôi viết và những gì tôi đọc. Các bạn có thể đề xuất những gì đang xảy ra ở đây không? Đây không phải là mã của tôi từ dự án của tôi ... Tôi chỉ đang cố gắng xác minh các chức năng freadfwrite tại đây.Làm thế nào để sử dụng các hàm fread và fwrite để đọc và ghi các tệp nhị phân?

#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) 
} 

Sau khi tôi làm fread() (giá trị HEX):

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

Sau khi tôi làm fwrite()

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

Các bạn đã cố gắng đóng cửa và sau đó mở lại tập tin? Tôi không chắc nội dung của một tệp là gì nếu bạn viết cho nó và sau đó đọc nó ngay lập tức. Bạn có thể phải đóng nó trước để đảm bảo dữ liệu bị xóa? Ngoài ra, hãy chắc chắn rằng bạn mở nó để đọc lần thứ hai xung quanh ... – aardvarkk

Trả lời

12

Mở tệp bằng chế độ w+ (đọc và viết). Các mã sau đây hoạt động:

#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; 
} 

Với đầu ra:

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

@ RichardJ.RossIII Có một số sửa chữa được thực hiện trong câu trả lời của tôi. – trojanfoe

3

Khi bạn mở tập tin, bạn quên để cho phép để đọc:

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

Nên là:

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

Chế độ 'rwb' không được nhận dạng. Tôi nghĩ bạn có nghĩa là 'w + b' hoặc' wb + '. – pmg

+0

@pmg 'rwb' hoạt động tốt đối với tôi, gcc trên Mac OSX Lion. –

+2

Vâng @Richard: nó không phải là tiêu chuẩn. [xem tại đây] (http://port70.net/~nsz/c/c99/n1256.html#7.19.5.3) hoặc [trong PDF này] (http://www.open-std.org/JTC1/sc22 /wg14/www/docs/n1256.pdf). – pmg

Các vấn đề liên quan