سؤال

لقد استخدمت الرمز أدناه لنسخها من ملف ثنائي إلى آخر ، لكن الملف الأول يحتوي على بعض مؤشرات 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.

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