2016-10-21 5 views
0

파일이나 키보드에서 입력을 읽는 프로그램이 있습니다. 입력을 파일 또는 키보드에서 삽입해야하는지 여부를 결정하는 방법을 찾았습니다.표준 입력 또는 파일 입력 C

각 유형의 입력에 대해 코드를 2 번 복사하지 않으려면이 결정을 쉬운 방법으로 구현해야합니다.

나는 벨로우즈 코드와 같은 것을 시도했지만 입력 파일 (arv == 1)에 대해서만 작업했지만 stdin에서 세그먼트 오류가 발생했습니다. 이 작업을 수행 할 수있는 빠른 방법이 있나요

FILE *fp; 

if (arg = 1) 
    fp = fopen (operationfile, "r"); 
else 
    fp = stdin; 

while (fgets(buffer, sizeof(buffer), fp) != NULL) 

:

오류 인수 == 0

(_IO_fgets (buf=0xbffffaac "\030\031\023", n=100, fp=0x0) at iofgets.c:52) 

코드에 대한 디버깅 후?

+2

함수 호출이 실패 할 가능성이있는 경우 항상 반환 값을 확인하십시오. 'fopen() '과 같은 I/O 함수는 특히 실패에 노출되어 있습니다. 반환 값을 확인하는 것이 적절하지 않은 경우는 거의 없습니다. 이 경우 신비한 세그 폴트가 아닌 오류 케이스에서 파일을 열지 못했음을 감지 할 수 있습니다. –

+1

표준 입력과 명명 된 파일 모두에 대해 동일한 코드를 사용할 수 있도록 코드를 작성하는 것이 좋습니다. 파일 스트림을 전달하는 함수 (그리고 오류 메시지를 생성해야하는 경우 파일 이름)에 읽기 코드를 넣는 것이 종종 적절합니다. 이렇게하면 코드를보다 쉽게 ​​일반화 할 수 있습니다. –

+0

main()에 대한 서명은 명령 행 매개 변수가있을 때 :'int main (int argc, char * argv [])'C에서'argc' 매개 변수는 결코 작지 않습니다 1. 왜냐하면'argv [0] '는 프로그램 실행 파일을위한'path/name'을 포함하고있는 char 문자열에 대한 포인터입니다. 하나의 명령 행 매개 변수를 가지려면'argc'의 값은 2가 될 것이고 매개 변수는'argv [1]'에서 char 문자열에 대한 포인터로 사용 가능할 것입니다. – user3629249

답변

5
if(arg == 1) /* == */ 
{ 
    .... 

은 많은 문제를 해결해야합니다. arg = 1arg을 1로 설정하고 항상 성공하므로 fp=stdin; 분기가 사용되지 않습니다.

또한 질문에 arg이 할당 된 방법이 표시되지 않습니다. 첫 번째 매개 변수는 main()입니까? 그렇다면 보통 argc이라고합니다. 일반 이름을 사용하면 다른 개발자가 코드를 더 쉽게 이해할 수 있습니다.

편집은

  • @MayurK 컴파일러 도움이 될 것입니다 1 == arg 오히려 arg == 1보다는를 이용하여, 지적 하듯이 당신을 보호 할 수 있습니다.

  • @EdHeal이 지적한 것처럼 일부 컴파일러는 거의 사용자가 원하는 것이 아니기 때문에 if(arg=1)을 검사하는 옵션을 제공합니다. GCC에서 -Wint-in-bool-context-Wparentheses이 유용합니다 (또는 더 좋은 점은 단지 -Wall입니다!).

+1

아마도 일부 컴파일러에는 그러한 실수를 감지하는 옵션이 있습니다. –

+1

LHS, 즉 e에서 상수를 쓰는 것이 항상 좋은 습관입니다. if (1 == arg) {}. "=="대신 "="을 쓰면 컴파일러에서 오류가 발생합니다. – MayurK

+0

글쎄 gcc가 감지하지 못했습니다. 당신이 옳았 . arg에 대해 걱정하지 마라. 그것들은 주된 주장이다. 문제는 해결되었습니다! –