2013-10-02 6 views
0

나는 여러 가지 오류와 경고를 가지고 있으며, 모든 것을 다 시도해 본 결과 알 수 없습니다. 귀하의 도움은 크게 그것을 높이 평가됩니다!하나의 파일을 다른 파일로 복사

copyfile.c : 기능에서 '주' copyfile.c : 44 : 3 : 경고 나는 그것이 이것이다 컴파일 할 때

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

int main() 
{ 
    /* Create Usable Variables */ 
    FILE *src_p, *dst_p; 
    char src_file[20], dst_file[20]; 
    char c; 

    /* Retrieve Source File Name From User */ 
    printf("Enter Source File Name:\n"); 
    fgets(src_file, 19, stdin); 

    /* Attempt Opening Source File For Reading */ 
    if((src_p = fopen(src_file, "r")) == NULL) 
    { 
     printf("ERROR: Source File Failed To Open...\n"); 
     return(-1); 
    } 

    /* Retrieve Destination File Name From User */ 
    printf("Enter Destination File Name:\n"); 
    fgets(dst_file, 19, stdin); 

    /* Attempt Opening Destination File For Writing */ 
    if((dst_p = fopen(dst_file, "w")) == NULL) 
    { 
     fclose(src_p); 
     printf("ERROR: Destination File Failed To Open...\n"); 
     return(-2); 
    } 

    /* Copy Source File Contents Into Destination File */ 
    while((c = fgetc(src_p)) != EOF) 
     fputc(c, dst_file); 

    /* Close Files On Success */ 
    fclose(src_p); 
    fclose(dst_p); 

    return 0; 
} 

및 오류 :이 내 코드입니다 : 호환되지 않는 포인터 유형에서 'fputc'의 인수 2 전달 [기본값으로 활성화 됨] copyfile.c에서 파일에 포함됨 : 1 : 0 : /usr/include/stdio.h:573:12 : 참고 : 'struct FILE * '하지만 인수는'char * '유형입니다

귀하의 도움은 크게 감사합니다 에드 !! 코드 dst_file에서

답변

0

파일 이름을 알아낼 때, 운영 체제에 따라 라인 피드, 캐리지 리턴 또는 둘 다를 포함하는 입력 행을 읽어야한다는 것을 알아야합니다. 따라서 이러한 불필요한 문자를 제거하는 편리한 방법이 필요합니다.

perl 등에서 아이디어를 빌리 자면 chomp()가 좋으며 줄 끝에서 '\ n'과 '\ r'을 제거합니다.

또한 파일 핸들 대 파일 핸들 대신 파일 이름의 fputc에주의해야합니다.

char [20]은 파일 이름에 비해 다소 작습니다. 200+를 시도하십시오. 'w +'가 존재하지 않을 때 출력 파일을 생성한다는 것을 알 수 있습니다. 하드 코드 된 크기보다는 fgets 크기에 sizeof (변수)를 사용하십시오.

이 작동,

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
char* chomp(char* p) 
{ 
    int len; 
    if(!p) return(p); 
    if((len=strlen(p))<=0) return(p); 
    if(p[len-1] == '\n') { p[--len] = '\0'; } 
    if(p[len-1] == '\r') { p[--len] = '\0'; } 
    return(p); 
} 
int main() 
{ 
    /* Create Usable Variables */ 
    FILE *src_fh, *dst_fh; 
    char src_fn[256+1], dst_fn[256+1]; 

    /* Retrieve Source File Name From User */ 
    printf("Enter Source File Name:\n"); 
    fgets(src_fn, sizeof(src_fn), stdin); chomp(src_fn); 

    /* Attempt Opening Source File For Reading */ 
    if((src_fh = fopen(src_fn, "r")) == NULL) 
    { 
     printf("ERROR: Source File %s Failed To Open...\n",src_fn); 
     return(-1); 
    } 

    /* Retrieve Destination File Name From User */ 
    printf("Enter Destination File Name:\n"); 
    fgets(dst_fn, sizeof(dst_fn), stdin); chomp(dst_fn); 

    /* Attempt Opening Destination File For Writing */ 
    if((dst_fh = fopen(dst_fn, "w+")) == NULL) 
    { 
     fclose(src_fh); 
     printf("ERROR: Destination File %s Failed To Open...\n",dst_fn); 
     return(-2); 
    } 

    int ch; 
    /* Copy Source File Contents Into Destination File */ 
    while((ch = fgetc(src_fh)) != EOF) 
    { 
     fputc(ch, dst_fh); 
    } 

    /* Close Files On Success */ 
    fclose(src_fh); 
    fclose(dst_fh); 
    return 0; 
} 
1

당신이 dst_p에 저장 FILE *을 획득, fopen 사용 이는 char [20]이다.

fputc(c, dst_file) 대신 fputc(c, dst_p)을 시도하십시오.

+0

LOL! 이런 ... 단순한 실수 같은 큰 두통. 고맙습니다. 3 분 안에 답을 받아 들일거야. –

+2

앞으로이 간단한 실수는 컴파일러에서보고 한 오류를 ** 신중하게 읽음으로써 쉽게 해결할 수 있습니다. gcc에서 오류 메시지를 다시 읽고 @cnicutar가 제공 한 정보를 이해했는지 확인하십시오. 당신은 그것에서 많은 것을 배울 것입니다. – Pankrates

+0

네 말이 맞아요, 고마워요. C에 대한 더 나은 디버거가 있습니까 (물론 IDE를 사용하지 않고)? –

관련 문제