قراءة ونسخ الملف مع مؤشر EOF في الوسط
سؤال
لقد استخدمت الرمز أدناه لنسخها من ملف ثنائي إلى آخر ، لكن الملف الأول يحتوي على بعض مؤشرات EOF (0xFF) كجزء منه ، وبالتالي تقوم وظيفة النسخ بنسخ الملف فعليًا حتى مؤشر EOF الأول.
على سبيل المثال: إذا كان ملفي {0x01, 0x02, 0x03, 0xFF, 0x01, 0x02, 0xFF, 0xFF}
عندها فقط {0x01, 0x02, 0x03}
سيتم نسخها إلى الملف الجديد. أي فكرة عن كيفية إصلاحه (أو ربما أفتقد شيئًا هناك ...)
شفرة:
int Util_Copy_File(char* source, char* dest)
{
FILE *fs,*ft;
char ch;
char infile[100];
sprintf(infile, "%s", dest);
fs = fopen(infile,"r");
if(fs==NULL)
{
return -1;
}
ft = fopen(dest,"w");
if(ft==NULL)
{
fclose(fs);
return STATUS_FAIL;
}
while(1)
{
ch = getc(fs);
if(ch==EOF)
{
break;
}
else
putc(ch,ft);
}
fclose(fs);
fclose(ft);
return 0;
}
شكرا ، بنيامين
المحلول
تقوم FGETC بإرجاع int ، وليس char ، حتى تتمكن من معرفة الفرق بين EOF و Char بنفس قيمة EOF.
يتغيرون:
char ch;
إلى
int ch
و (عادة غير وثيق الصلة إذا كنت على *nix)
fs = fopen(infile,"r");
إلى
fs = fopen(infile,"rb");
نصائح أخرى
0xFF
ليس EOF
. -1 هو EOF
. المشكلة هي أنك تخزن int
قيمة الإرجاع getc
في char
, الذي ينهار 0xFF
على -1 (في الواقع سلوك محدد للتنفيذ ولكن هذا ما ستفعله التطبيقات المشتركة).
قيمة الإرجاع getc
هو int
التي تكون قيمتها إما في نطاق unsigned char
أو EOF
(التي لها قيمة -1). والنوع الصحيح للبيانات الثنائية هو unsigned char
, ، ليس char
.