2012-11-28 2 views
1

프로그램으로 파일 리디렉션하는 데 문제가 있습니다. 나는 Test라는 Makefile을 가지고 있으며 텍스트 파일을 입력으로 리디렉션하고 싶습니다. 예를 들어, 내가하고 싶은 :프로그램으로 파일 리디렉션

테스트 내 실행에 입력으로 < file.txt를

. 그러나 file.txt의 내용을 읽으 려 할 때 세그멘테이션 오류가 계속 발생합니다. 내 시도는 다음과 같습니다.

int main(int argc, char* argv[]) 
{ 
    FILE *a; 
    int count; 
    a = fopen(argv[1], "r"); 
    for(n = 0; ; n++) 
    { 
    count = fgetc(a); // <- here is where my program segfaults 
    if(feof(a)) 
     break; 
    } 
    return 0; 
} 

왜 이런 일이 발생하는지 알고 계십니까?

+1

올바르게 'eof'를 해 주셔서 감사합니다. –

답변

1

리다이렉션이 쉘에 의해 처리되고 인수로 전달되지 않기 때문입니다. 리다이렉션을 사용할 때 파일은 stdin에 사용됩니다.

항상 함수의 결과를 확인해야합니다.이 경우 fopenNULL으로 파일 이름으로 호출하여 NULL을 세그먼테이션 오류로 반환합니다.

+0

'fgetc'은 인수로 NULL을 사용하여 정의되지 않습니다 (물론 비 스트림 인수의 "전문화")? 그것은 어떤 이유로 나는 놀라지 만, 그것은 문서에서 암시하는 것처럼 보일 것입니다. –

+0

@LightnessRacesinOrbit 나는 C 표준을 가지고 있지 않지만, 내가 접근 할 수있는 참조 (실제 C 표준의 복사본이되어야하는 POSIX 표준 포함) 중 아무 것도 파일 포인터로 'NULL'을 사용하는 것에 대해 언급하지 않았다. 분명히 정의되지 않은 행동이라고 말할 수 있습니다. 아마도 일부 구현은 올바른 포인터 일 때 어떤 동작도하지 않고 액세스합니다. –

+0

왜 내가 놀랐는지 알아 내려고합니다. 나는 POSIX 함수가 에러시에 보석금을 매기는 경향이 있기 때문에 아마도 "안전한"결과를 기대했을 것이다. 오류가있을 때'EOF'를 반환하도록 정의 된'fgetc' (나는 이것이 잘못된 코드를 포함해야한다고 주장하지는 않는다. 입력 사례, 그냥 흥미 롭습니다) –

0

셸에서 "<"및 "file.txt"를 프로그램의 인수로 전달하지 않으므로 argv[1]이 임의의 가비지를 반환합니다.

a에서 읽는 대신 stdin에서 읽어야하며 자동으로 사용 가능하게됩니다.

int main(int argc, char* argv[]) 
{ 
    int count; 
    for(n = 0; ; n++) 
    { 
    count = fgetc(stdin); 
    if(feof(stdin)) 
     break; 
    } 
    return 0; 
} 
관련 문제