it-swarm.dev

القراءة / الكتابة إلى الملفات الثنائية في C

هل لدى أي شخص مثال على الكود الذي يمكنه الكتابة إلى ملف ثنائي. وكذلك الكود الذي يمكنه قراءة الملف الثنائي والإخراج إلى الشاشة. بالنظر إلى الأمثلة ، يمكنني الكتابة إلى ملف جيد ، لكن عندما أحاول القراءة من ملف ، لا يتم إخراجه بشكل صحيح.

50
user1257114

قراءة وكتابة الملفات الثنائية هي نفسها إلى حد كبير مثل أي ملف آخر ، والفرق الوحيد هو كيف يمكنك فتحه:

unsigned char buffer[10];
FILE *ptr;

ptr = fopen("test.bin","rb");  // r for read, b for binary

fread(buffer,sizeof(buffer),1,ptr); // read 10 bytes to our buffer

لقد قلت إن بإمكانك قراءتها ، لكن لا يتم إخراجها بشكل صحيح ... ضع في اعتبارك أنه عندما "تقوم بإخراج" هذه البيانات ، فأنت لا تقرأ ASCII ، لذلك ليس مثل طباعة سلسلة على الشاشة:

for(int i = 0; i<10; i++)
    printf("%u ", buffer[i]); // prints a series of bytes

الكتابة إلى ملف هي نفسها إلى حد كبير ، باستثناء أنك تستخدم fwrite() بدلاً من fread() :

FILE *write_ptr;

write_ptr = fopen("test.bin","wb");  // w for write, b for binary

fwrite(buffer,sizeof(buffer),1,write_ptr); // write 10 bytes from our buffer

بما أننا نتحدث عن Linux .. فهناك طريقة سهلة لإجراء فحص عقلاني. قم بتثبيت hexdump على نظامك (إذا لم يكن موجودًا بالفعل) وتخلص من ملفك:

[email protected]:~/C$ hexdump test.bin
0000000 457f 464c 0102 0001 0000 0000 0000 0000
0000010 0001 003e 0001 0000 0000 0000 0000 0000
...

الآن قارن ذلك بإخراجك:

[email protected]:~/C$ ./a.out 
127 69 76 70 2 1 1 0 0 0

حسنًا ، ربما غيّر printf إلى %x لجعل هذا أكثر وضوحًا:

[email protected]:~/C$ ./a.out 
7F 45 4C 46 2 1 1 0 0 0

انظر! تتطابق البيانات الآن*. رائع ، يجب أن نقرأ الملف الثنائي بشكل صحيح!

* لاحظ أنه يتم تبديل البايتات فقط على المخرجات ولكن هذه البيانات صحيحة ، يمكنك ضبط هذا النوع من الأشياء

82
Mike