2009-07-31 5 views
0
#include<stdio.h> 


void main() 
{ 
FILE *fp,*fp1; 
char c; 
fp=fopen("test.txt","r"); 
fp1=fopen("test1.txt","w"); 
c=getc(fp); 
while(c!=EOF) 
{ 
    if (c=="") 
    { 
     c=getc(fp); 
     continue; 
    } 
    else 
     fprintf(fp1,"%s",c); 
    c=getc(fp); 
} 
fclose(fp); 
fclose(fp1); 

} 
+0

특정 질문에 대한 답변을 이미 갖고 있지만 일반적으로 디버거가 있습니까? 이는 특정 세분화 오류의 최소한 즉각적인 원인을 찾는 가장 좋은 방법입니다. – quark

+0

'fp'와'fp1'보다는'file1'과'file2'와 같은 좋은 변수 이름을 사용해야합니다. – GManNickG

답변

10

문자는 문자열이 아니기 때문에.

fputc를 사용해보십시오.

BTW : c는 int 여야합니다. 그렇지 않으면 EOF를 감지 할 수 없습니다. EOF> 255.

+0

Nitpick : EOF는 보통 0보다 작습니다 (그러나 반드시 그럴 필요는 없습니다). –

5

c==""도 생각대로 작동하지 않습니다.

3

문제는 변수 c의 fprintf ("% s")입니다. c는 문자열이 아니며 단일 문자입니다. 그 라인을

fprintf(fp1,"%c",c); 

으로 바꾸십시오. 그러면 문제가 해결됩니다. 실제로 한 파일의 내용을 다른 파일로 복사하는 더 좋은 방법이 있습니다.

+0

더 좋은 방법은 무엇입니까? – Hick

+0

가장 좋은 방법은 "cp"입니다. 그러나 나는 이것이 운동이라는 것을 모았습니다. 또는 복사하는 동안 내용을 필터링하는 것과 같이 좀 더 흥미로운 것을하려고합니다. 위의 접근법에서 가장 큰 문제점은 한 번에 한 캐릭터를 읽는 것이 매우 느립니다. 최소한 블록 크기가 약 16k 인 read()/write() 또는 fread()/fwrite() 등을 통해 한 번에 청크 파일을 읽고 쓰고 싶습니다. – Nelson

+0

예. 나는 모든 흰 공백을 제거하고 있습니다. 렉서를 개발 중입니다. 지금은 그 방법으로는 작동하지 않습니다. – Hick

6

문제를 일으킬 수있는 코드에는 여러 가지 문제가 있습니다.

fpfp1은 파일 열기 실패를 확인 fopen 결과가 할당 된 후 NULL에 대해 확인한다.

c 유형은 을 올바른 문자 읽기와 올바르게 구별 할 수 있도록 int이어야합니다.

c == "" 리터럴 길이가 0 인 문자열의 주소와 문자 값을 비교하려고 시도합니다.

fprintf(fp1,"%s",c)은 문자 값 c를 상수 문자열의 주소로 해석하고이 주소를 따라 문자열을 인쇄하려고 시도합니다. 세그멘테이션 오류가 발생할 가능성이 가장 높은 오류입니다.


덜 중요한 스타일 문제.

main의 반환 값은 int이어야합니다. void main(void)이 많은 구현을 허용하더라도 이식 가능합니다. 당신의 if 조항의 몸으로

는 루프가 끝까지 실행하고 continue 다음 경우 아마이 절을 제거하고 문 경우 것과 반대와 함께를 적용 명확하게 될 것이다, 무슨 일이 일어날 지와 일치 c==""은 현재 else 성명이되어야한다고 생각합니다.

0

코드가 잘못된 메모리 액세스로 인해 세그먼트 화 오류를 발생시키는 경우 fprintf는 종료 문자를 찾아이 프로세스에서 잘못된 메모리 위치에 액세스합니다.
또한 파일 포인터는 널 (null)을 검사해야하며, 그 중 하나라도 null 인 경우 코드가 정상적으로 종료되어야합니다. 그렇지 않으면 segfault가 발생합니다.

관련 문제