2015-07-25 4 views
-1

Это делает меня орехами Я пытаюсь создать простую программу для копирования любого типа файла с помощью следующего кода, но результат, который я получаю, неожиданен (один или два дополнительных символа в конце скопированного файла?). Например, если мой исходный файл This is an example скопированный файл содержит This is an exampleÿДополнительный символ в конце во время копирования?

КОД

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    FILE *fp,*fpp; 
    char pbuff, fname[32]; 
    int i; 

    printf(" FILE NAME TO OPEN : "); 
    scanf(" %32s", fname); 
    fp = fopen(fname, "rb"); 
    fpp = fopen("file", "wb"); 
    if(fp==NULL) 
    { 
     printf("NO SUCH FILE. EXITING NOW."); 
     getch(); 
     exit(1); 
    } 

    while(!feof(fp)) 
    { 
     pbuff = fgetc(fp); 
     fputc(pbuff, fpp); 
    } 

    printf("SUCCESSFULLY CREATED!"); 
    fclose(fp); 
    fclose(fpp); 
    getch(); 
    return(0); 
} 

Может кто-нибудь помочь мне с этим? Я буду очень благодарен.

+0

feof() внутри время цикла может создать проблему, не используйте его, используйте fgets(). – udit043

+0

Вы могли бы быть более конкретными? – Naveen

+2

прочитайте это http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong – udit043

ответ

2

Причина в том, что feof (как и большинство индикаторов конца файла в большинстве языков/сред) устанавливается только после достижения конца файла. Поскольку вы пишете символ и только затем проверяете статус EOF, вы пишете 1 слишком много символов. Возвращаемое значение fgetc - это предопределенный EOF, если во время разговора был достигнут конец файла.

Вы могли бы решить, что в 1 из 2 способов:

while(true) 
{ 
    pbuff = fgetc(fp); 
    if(feof(fp)) 
     break; 
    fputc(pbuff, fpp); 
} 

Или: (! Редактировать, как Мельпомены правильно заметили)

// Change pbuff to type int in the declartion, and then... 
while(true) 
{ 
    pbuff = fgetc(fp); 
    if(EOF == pbuff) 
     break; 
    fputc(pbuff, fpp); 
} 
+0

'pbuff' не может быть' char'. Это должно быть 'int'. – melpomene

+0

Я могу купить тебе пиво! ;) – Naveen

Смежные вопросы