2012-11-27 2 views
1

필자는 파일을 매우 간단하게 읽고 파일에있는 내용을 적절히 인쇄하는 코드를 작성하고 있습니다.입력 파일의 각 줄을 두 번 인쇄 하시겠습니까?

필자는 이러한 프로그램을 파일 끝에서 끝내고 적절한 솔루션을 찾았다 고 생각했습니다. 그러나 각 줄은 저의 이유 때문에 출력물에 두 번 인쇄됩니다. 열쇠는 두 번 인쇄되어

int main(int argc, char *argv[]) { 
    // insure 2 arguments given, one for a.out and one for the test file 
    if (argc != 2) { 
     // result if request fails 
     printf("Requires 2 arguments. Be sure to include test file location\n"); 
     return 0; 
    } 

    FILE *fp; //open the file 
    fp = fopen(argv[1], "r"); 

    char option; 
    int key; 
    int i = 0; 
    while (fscanf(fp, "%c %d", &option, &key) != EOF) { 
     printf("%d\n", key); 
    } 
} 

:

여기 내 주요 파일입니다!

이 오류는 과도한 노출로 인해 간과 할 수없는 간단한 오류입니다.

+3

입력 파일의 샘플을 제공해 주시겠습니까? – louxiu

답변

0

당신은 아마 원하는 :

fscanf(fp, "%c %d\n", &option, &key); 

그리고 당신은 또한 루프의 첫 번째 반복에서 2

동일 있는지 확인 fscanf의 반환 값을 확인하려면, 개행이되지 않는 소비. 두 번째 반복에서

는 줄 바꿈 소비와 option에 넣어, 그리고 %d이 일치하지 않고, fscanf 반환 1. key가 다시 인쇄됩니다 이유입니다 변경되지 않습니다.

세 번째 반복에서 fscanf은 마침내 EOF을 반환합니다.

일반 규칙 : 반환 값이 예상 한 값인지 항상 확인하십시오. (당신은 또한 fopen에서 반환을 확인하지 않음으로써이 규칙을 위반합니다.) 최악의 경우에는 아무것도하지 않습니다. 기껏해야, 이런 문제를 디버그하는 데 도움이됩니다.

+0

코드는'fscanf()'의 반환 값을 검사해야합니다. –

+0

@JonathanLeffler : 음, 그 말을 믿습니다. 또한 형식 문자열에'\ n'을 추가하는 것이 주요 버그에 대한 수정이라고 생각합니다. – Nemo

+0

Err .. 네가 한 것 같아. 코드는 단어보다 더 크게 말하고 반영하지 않습니다. –

0
#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    if (argc != 2) 
    { 
     fprintf(stderr, "Requires 1 argument - a file name\n"); 
     return 1; 
    } 

    FILE *fp; //open the file 
    if ((fp = fopen(argv[1], "r")) == 0) 
    { 
     fprintf(stderr, "Failed to open file %s\n", argv[1]); 
     return 1; 
    } 

    char option; 
    int key; 
    while (fscanf(fp, "%c %d", &option, &key) == 2) 
     printf("%d\n", key); 
    return 0; 
} 

오류보고 및 파일 읽기 프로세스의 변경 사항에 유의하십시오. 코드는 여전히 당신이 원하는 것은 아닙니다. 첫 번째 행 다음에 option에 저장된 입력의 첫 번째 행 뒤의 숫자 다음에 개행을 가져올 수 있습니다. fgets()sscanf()을 필요로 고정이 :

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    if (argc != 2) 
    { 
     fprintf(stderr, "Requires 1 argument - a file name\n"); 
     return 1; 
    } 

    FILE *fp; //open the file 
    if ((fp = fopen(argv[1], "r")) == 0) 
    { 
     fprintf(stderr, "Failed to open file %s\n", argv[1]); 
     return 1; 
    } 
    char buffer[1024]; 
    while (fgets(buffer, sizeof(buffer), fp) != 0) 
    { 
     char option; 
     int key; 
     if (fscanf(fp, "%c %d", &option, &key) == 2) 
      printf("%d\n", key); 
     else 
     { 
      fprintf(stderr, "Format mismatch on %s", buffer); 
      fclose(fp); // Not 100% necessary here, but tidiness is important 
      return 1; 
     } 
    } 
    fclose(fp);   // Not 100% necessary here, but tidiness is important. 
    return 0; 
} 

나는 프로그램을 종료하는 것입니다, 그리고 main()에서 returnexit()에 거의 동등 때 중요하지 않고, 말 이전에 fp 폐쇄 있지만. 그래도 main() 이외의 함수에있는 경우 파일 스트림 fp과 같이 할당 한 모든 리소스를 확보하는 것이 매우 중요합니다.

경고 : 코드가 컴파일되지 않았습니다. 주의 사항.

관련 문제