2014-02-16 4 views
1

텍스트 파일 "hello.txt"이 있는데,이 파일을 읽고 stdout 번 10 번 쓰려면 어떻게해야합니까? 다음과 같이파일의 내용을 읽고 쓰십시오.

는 내가 현재하고있는 중이 야 것은 : -

#include<stdio.h> 
main(){ 
int c,i; 
FILE *fp; 
for(i=0;i<10;++i) { 
    fp = fopen("hello.txt","r"); 
    for(;c!=EOF;c= getc(fp),putchar(c)); 
    fclose(fp); 
} 
return 0; 
} 

이 코드가 인쇄 내용 1 회 만 하지 10 회.

+0

좋은 방법은 오류를 찾기 위해 프로그램을 디버깅하는 것입니다. –

+1

'c'는'EOF'에 대한 테스트이기 때문에 초기에 루프를 입력 할 때 코드는 이미 정의되지 않은 동작을합니다. 초기화되지 않은 변수를 읽으면 정의되지 않은 동작이 발생합니다. – alk

답변

2

변수 c의 첫 번째 반복 값 끝에 EOF가 발생하고 모든 다음 반복에서 루프 조건에 대해 c != EOF으로 인해 루프가 끊어져서 문자를 인쇄 할 수 없다는 버그가 있습니다. 실제로 코드에서 정의되지 않은 동작을 일으키는 원인이되는 초기화되지 않은 c을 사용하여 @alk 고지와 comment을 질문합니다.

각 for 루프가 시작될 때 c을 (다시) 초기화해야합니다.

교체 :

for(;c!=EOF;c= getc(fp),putchar(c)); 

기준 :

for(c = getc(fp); c != EOF; putchar(c), c= getc(fp)); 
// ^^ always initialize ^^   ^^ swap order 

를 또한 다음 더 나은 방법이다 void rewind (FILE * stream); 기능을 사용하기 위해 또 다시 파일을 읽으려면, 당신은 파일을 되감기 할 필요가 루프가 끝날 때 파일의 시작 부분에 대한 포인터 :

fp = fopen("hello.txt", "r"); 
for(i = 0; i < 10; ++i) { 
    for(c = getc(fp); c != EOF; c = getc(fp), putchar(c)); 
    rewind(fp); 
} 
fclose(fp); 

참고 : ;, 뒤에 코드를 읽을 수있는 공간을 만드십시오.

코드에서 c는 EOF 루프가 영원히 무시됩니다 될 때 같이
+0

정말로 니픽 마디킹 :'reinitialise'는'(재) 초기화 '가 더 좋습니다. OP에 대한 내 의견을 참조하십시오. – alk

+0

@alk 네, 맞습니다. 나는 심지어 눈치도 못 챘습니다. 이제 나는 내 대답에 감사를 추가했습니다. –

2
#include<stdio.h> 
main(){ 
int c,i; 
FILE *fp; 
for(i=0;i<10;++i) { 
    fp = fopen("hello.txt","r"); 
    while ((c = getc(fp)) != EOF) { 
     putchar(c); 
    } 
    fclose(fp); 
} 
return 0; 
} 

!

+0

ohh thankyou..for the reply – avinashse

+1

@ GrijeshChauhan- 아니요 - 마지막 줄에는 문맥이 필요합니다. –

2

파일을 다시 읽기 전에 c을 초기화해야합니다. 코드에서 cEOF이며 영원히 머무르고 루프는 for이 아닙니다.

c = 0; 
for(;c!=EOF;c= getc(fp),putchar(c)); 
관련 문제