2013-06-18 6 views
-1

나는 다음과 같은 조건과 함께 다른 파일을 하나 개의 파일의 내용을 복사하는 C 프로그램이 필요한 C 언어에서 다른 파일의 내용을 복사 :는 파일 만들기 및

1) 우리는 데이터를 읽을 수있는 파일을 존재할 수도 있고 존재하지 않을 수도있다.

2) 데이터를 복사 할 파일이 존재할 수도 있고 존재하지 않을 수도 있습니다.

파일이있는 경우 데이터가 직접 복사되고 파일이 존재하지 않으면 파일을 만들고 파일에 데이터를 입력 한 다음 나중에 파일의 내용을 파일에 복사하는 옵션이 있어야합니다. 다른 파일.

#include<conio.h> 
#include<stdio.h> 
#include<stdlib.h> 
void main() 
{ 
FILE *f1,*f2; 
char c; 
char name1[20],name2[20]; 
clrscr(); 
setvbuf(stdout, 0, _IONBF, 0); 
printf("\nEnter the source file name :"); 
scanf("%s",name1); 
if((f1=fopen(name1,"r"))==NULL) 
{ 
    fclose(f1); 
    f1=fopen(name1,"w"); 
    printf("\nThe specified file does not exist \nNew file will be created"); 
    printf("\nEnter the data for the new file : "); 
    while((c=getchar())!=EOF) 
    { 
    putc(c,f1); 
    } 
    fclose(f1); 
} 
f1=fopen(name1,"r"); 
printf("\nEnter the destination file name :"); 
scanf("%s",name2); 
f2=fopen(name2,"w+"); 
while((c=getc(f1))!=EOF) 
{ 
    putc(c,f2); 
} 
rewind(f1); 
rewind(f2); 
printf("The data in the source file is :\n"); 
while((c=getc(f1))!=EOF) 
{ 
    printf("%c",c); 
} 
printf("\nThe data in the destination file is :\n"); 
while((c=getc(f2))!=EOF) 
{ 
    printf("%c",c); 
} 
fclose(f1); 
fclose(f2); 
fflush(stdin); 
getch(); 
} 

그러나 프로그램이 소스 파일이 이미 존재하는 경우에만 작동합니다 :

나는 내 수정 된 코드는 현재 다음 코드,

을했다. 새 파일을 만들면 대상 파일 이름에 대한 입력이 수행되지 않고 대상 파일 파일의 데이터가 비어 있습니다. 이제 어떻게해야하지?

작동하도록 수정하려면 어떻게해야합니까? 나에게 원하는 코드를 제안 해주세요 ... 감사합니다!

+3

정확히 어떤 작동하지 않는 이유는 무엇입니까? "효과가 없다"는 것은 유익하지 않습니다. –

+0

새 파일을 만들면 대상 파일 이름에 대한 입력이 수행되지 않고 대상 파일 파일의 데이터가 비어 있습니다. –

답변

0

글쎄, 난 당신의 코드에서 몇 가지 문제를 볼 수 있지만 가장 중요한 하나는 식이다 :

(c=getc(f1))!=EOF 

이 항상 참으로 평가, 귀하는 무한 루프를 실행하겠습니다 있도록. 당신이 getc 문서를 읽는다면 당신은이 int 아닌 char 반환 것을 깨닫게됩니다 :

getc documentation

을 그래서 기본적으로 당신이 일반적으로 -1로 정의 된 intEOF를 절단되고 무슨 일을하는지에 charEOF에 비교 될 때 intc을 추진 한 후

c=getc(f1) // At this point C = 255(0xFF) if getc returned EOF 

과, 0부터은 255를 유지하기에 충분하므로 입니다. 비교는 255입니다. = -1. 항상 true입니다.

cint으로 신고하면 문제를 해결할 수 있습니다.

좀 더 팁 :

당신은 또한뿐만 아니라 다른 오류 조건에 feofgetc 이후 수익률 EOF를 사용하여 파일의 끝 상태임을 확인 할 수 있습니다.

printf 전화로 문장의 끝 부분으로 이동하여 stdout에서 강제로 플러시하도록 할 수 있습니다.아니면 다른 방법은 프로그램의 시작이를 추가 할 수 있습니다 : 당신이 name1name2에서 파일 이름을 저장하는 것 같다

setvbuf(stdout, 0, _IONBF, 0); 

, 그래서 당신은 fopen 파일 이름에서 따옴표를 제거 할 수 있도록 실제로 사용하십시오.

name2을 열면 쓰기 액세스 만 사용하지만 마지막에는 내용을 읽고 표시하려고 시도 할 때 "w+"을 액세스 모드로 사용할 수 있습니다.

결과 데이터를 인쇄하려고 할 때 f2의 파일 핸들러가 이미 닫혔습니다. 파일 커서는 이미 파일 끝에 있으므로 rewind을 사용하고 싶을 수도 있습니다.

//fclose(f2); 
rewind(f1); 
rewind(f2); 
printf("The data in the source file is :\n"); 
while((c=getc(f1))!=EOF) 
{ 
    printf("%c",c); 
} 
printf("The data in the destination file is :\n"); 
while((c=getc(f2))!=EOF) 
{ 
    printf("%c",c); 
} 
fclose(f1); 
fclose(f2); 
+0

고마워요 @Julio Moreno –

+0

rewind (f1), rewind (f2) 문을 추가했습니다. fclose (f2) 문을 삭제했습니다. 큰 따옴표를 제거했습니다. 모드를 w +로 변경했습니다. 모든 것이 잘되었다 ... 나는 getc()로 문제를 발견하지 못했다. 그러나 소스 파일이 이미있는 경우에만 프로그램이 제대로 작동합니다. 새 파일을 만들면 대상 파일 이름에 대한 입력이 수행되지 않고 대상 파일 파일의 데이터가 비어 있습니다. 이제 어떻게해야하지? –

+0

수정 된 코드로 나를 도울 수 있습니까? ... –

0

마침내 성공 코드는 다음과 같습니다

#include<conio.h> 
#include<stdio.h> 
#include<stdlib.h> 
void main() 
{ 
FILE *f1,*f2; 
char c; 
char name1[20],name2[20]; 
clrscr(); 
printf("\nEnter the source file name :"); 
scanf("%s",name1); 
if((f1=fopen(name1,"r"))==NULL) 
{ 
    fclose(f1); 
    f1=fopen(name1,"w"); 
    printf("\nThe specified file does not exist \nNew file will be created"); 
    printf("\nEnter the data for the new file : "); 
    while((c=getchar())!='^') 
    { 
    putc(c,f1); 
    } 
    fclose(f1); 
} 
f1=fopen(name1,"r"); 
printf("\nEnter the destination file name :"); 
scanf("%s",name2); 
f2=fopen(name2,"w+"); 
while((c=getc(f1))!=EOF) 
{ 
    putc(c,f2); 
} 
rewind(f1); 
rewind(f2); 
printf("The data in the source file is :\n"); 
while((c=getc(f1))!=EOF) 
{ 
    printf("%c",c); 
} 
printf("\nThe data in the destination file is :\n"); 
while((c=getc(f2))!=EOF) 
{ 
    printf("%c",c); 
} 
fclose(f1); 
fclose(f2); 
fflush(stdin); 
getch(); 
}