2013-06-28 48 views
6

Tôi muốn đọc 4 byte đầu tiên từ tệp binnary là một loại bài hát.wav. Trong tệp .wav, 4 byte đầu tiên phải là 52-46-49-49 và tôi phải đọc chúng để kiểm tra sau nếu chúng đúng.cách đọc byte theo byte từ một tệp

Điều này là tôi có một lỗi biên dịch tại dòng fread có nội dung là invalid conversion from "unsigned char" to "void"initialzing argument 1 of 'size_t fread(void*,size_t,size_t,FILE*) và tôi không biết ý nghĩa của nó.

Tôi đã thấy trong một chủ đề trước đây, đây là cách mà fread phải được thực hiện nếu tôi muốn đọc byte theo byte. Nếu bất cứ ai có bất kỳ ý tưởng làm thế nào tôi có thể đọc byte byte và lưu trữ chúng trong một mảng đó là tuyệt vời. Cảm ơn bạn.

void checksong(char *argv[]){ 
    FILE *myfile; 
    int i; 
    unsigned char k[4]; 
    myfile=fopen(argv[2],"r"); 
    i=0; 
    for(i=0; i<4; i++){ 
     fread(k[i],1,1,myfile); 
    } 
    for(i=0; i<4; i++){ 
     printf("%c\n", k[i]); 
    }         
    return ; 
} 
+0

sử dụng 'getc()' 'char' luôn là byte. –

Trả lời

10

Đó là một lỗi duy nhất:

Invalid conversion from unsigned char to void* initializing argument 1 of

size_t fread(void*,size_t,size_t,FILE*) 

Nó có nghĩa là một k[i]unsigned char, và không phải là một con trỏ. Bạn nên sử dụng &k[i] hoặc k+i.

Tuy nhiên, bạn không thực sự cần đọc byte theo byte. Bạn có thể đọc 4 byte, không có vòng tham gia:

fread(k, 4, 1, myfile); 

In số:

for (i=0; i<4; i++) 
    printf("%d\n", k[i]); 
+0

tôi đã làm nó và nó cố định lỗi của tôi, cảm ơn bạn.Nhưng thay vì những con số 52-46-49-49 rằng tôi sẽ nhận được tôi nhận được một số biểu tượng lạ: S –

+1

@ ZoNiaC Bạn nhận được các con số. chỉ in chúng bằng% d chứ không phải% c. – Elazar

5

Để đọc chính xác một byte và lưu nó vào k tại index i, bạn cần phải cung cấp địa chỉ của phần tử i

for(i=0; i<4; i++){ 
    fread(&k[i],1,1,myfile); 
} 

Tuy nhiên, bạn muốn đọc toàn bộ 4 byte trong một lần nếu bạn quan tâm đến chúng 4. Vì vậy, không cần for vòng lặp ở tất cả, và chỉ cần làm:

fread(k,1,4,myfile); 

Nó cũng là thực hành tốt để kiểm tra mã trở lại của fread (và bất kỳ I/O hoạt động cho rằng vấn đề) trong trường hợp nó không thành công. man fread để biết thêm thông tin.

4

Bạn có thể sử dụng chỉ

char buffer[4]; 
fread(buffer,1,4,myfile); 
0

bạn không cần phải sử dụng fread() Ngay cả những fgetc() hoạt động tốt. Mã hóa đơn giản. SImple như đọc một tập tin văn bản.

#include <stdio.h> 

int main(int argc, char** argv) 
{ 
    FILE* f = fopen("lak", "rb"); 
    fseek(f,0,SEEK_END); 
    long lsize=0,i=0; 
    lsize = ftell(f); 
    rewind(f); 

    while(i<lsize){ 
     int first = fgetc(f); 
     i++; 
     printf("first byte = %x\n", (unsigned)first); //you can do anything with 
                 //first now 
    } 

fclose(f); 

return 0; 
} 
Các vấn đề liên quan