سؤال

لدي ملف. قرأت حجم الملف. ثم حلقة قراءة اثنين بايت في وقت واحد حتى وصلت إلى نهاية الملف. بعد كل عملية قراءة، أقدم الموضع الحالي بنسبة 2، ولكن لا يتم زيادة الموقف بعد أن أحصل على نصف حجم الملف، وسوف تقرأ عملية FREAD 0 BYTES.

يقوم البرنامج بقراءة حجم الملف. أقوم بإجراء FREAD (2 بايت في كل مرة) حتى يتساوى الموضع الحالي بحجم الملف. إنه يقرأ 22915 مقابل حجم الملف يزيد من الموقف بمقدار 2 بعد كل القراءة، ولكن عندما يصل الموضع الحالي إلى 11459 وهو نصف حجم الملف الذي سيقرأه صفر بايت وبالتالي ذاهب إلى حلقة لا حصر لها.

FILE *file;
char *file_name;
int readCount = 0;
int position = 0;
int fileSize;
unsigned short mem_accesses;

file_name = "sample.txt";

/** open the file */
file = fopen(file_name, "rb");
fseek(file, 0, SEEK_END);
fileSize = ftell(file);
rewind(file);


while(position<fileSize){
   mem_accesses = getNumberAccesses();
   printf("position: %d filesize: %d\n",position, fileSize);

}

unsigned short getNumberAccesses(){
/** calculate number of accesses for process */
unsigned short val;

readCount = fread(&val, sizeof(val), 2, file);

position += readCount;
printf("read count: %d\n", readCount);

return val;
}
هل كانت مفيدة؟

المحلول

readCount = fread(&val, sizeof(val), 2, file);  

يقرأ هذا البيان عن طريقتين من اثنين بايت لكل منهما. ويعيد القيمة 2, ، لعدد البنود القراءة. المعلمات الثانية والثالثة مضروبة معا fread كم عدد بايت القراءة.

نصائح أخرى

forread العودة عدد العناصر القراءة، وليس عدد البايتات.

(بالمناسبة، في التعليمات البرمجية التي تمنحها عن طريق الخطأ عدد العناصر 2 التي تسبب تجاوزا مؤقتا).

يجب عليك التحقق من قيمة إرجاع FREAD حتى لا تعمل في حلقات لا حصر لها في حالة الأخطاء.

بدلا من الاستعلام عن حجم الملف، أود ببساطة استدعاء Froad (أو وظائف الإدخال الأخرى) في حلقة حتى نهاية الملف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top