C에서 파일을 읽는 동안 오류 처리

pawel.ad

Conway의 Game of Life에 대한 C 구현을 마치고 있는데 잘못된 네팅 파일을 구문 분석 할 때 오류 처리에 문제가 있습니다.

파일 형식은 다음과 같습니다.

rows cols
x1   y1
x2   y2

읽기 기능 :

net_t *file_to_net( net_t *n, char *filename )
{
assert( n != NULL );

FILE *f = fopen( filename, "r" );
if( f == NULL )
    print_error_file( filename );

if( fscanf( f, "%d %d", &(n->rows), &(n->cols) ) != 2 )
    print_error("net");

n->vec = calloc( n->rows * n->cols, sizeof(unsigned char) );
if( n->vec == NULL )
    print_error("alloc");

int i, x, y;
while( fscanf( f, "%d %d", &x, &y ) == 2 )
{
    if( x > n->rows || y > n->cols )
    {
        fprintf( stderr, "%sERROR:%s Coordinates of living cell in net file is bigger then net dimensions.\n", COLOR_RED, COLOR_RESET );
        exit(EXIT_FAILURE);
    }

    i = ( n->cols * (x - 1) ) + (y - 1);
    n->vec[i] = 1;
}
if( !feof(f) )
    print_error("net");

fclose(f);

return n;
}

오류 처리는 숫자 대신 문자 (루프가 끝나지만 EOF는 아님)가있을 때 작동하지만 좌표 중 하나가 없으면 (홀수 숫자가 있음) 작동하지 않습니다. 예를 들면 다음과 같습니다.

50 50
2 3
3 4
4
4 3
4 4

오류로 끝나지 않습니다. 나는 그것을 구현하려고 노력했지만 3 가지 경우 모두에서 작동하도록 만들 수 없습니다 (좋은 파일, 내부 숫자가 아닌 숫자 및 홀수 숫자).


편집하다

좋습니다. 도움을 주셔서 대단히 감사합니다. 다음 세 가지 경우를 모두 포함하는 루프 코드로 끝났습니다.

int i, x, y;
int pos;
while( fgets( line, MAXL, f ) != NULL )
{
    if( sscanf( line, "%d %d %n", &x, &y, &pos ) != 2 )
    {
        print_error("net");
    }
    else if( line[pos] != '\0' )
    {
        print_error("net");
    }


    if( x > n->rows || y > n->cols )
    {
        fprintf( stderr, "%sERROR:%s Coordinates of living cell in net file is bigger then net dimensions.\n", COLOR_RED, COLOR_RESET );
        exit(EXIT_FAILURE);
    }

    i = ( n->cols * (x - 1) ) + (y - 1);
    n->vec[i] = 1;
}
조나단 레플러

다음을 바꿀 수 있습니다.

while( fscanf( f, "%d %d", &x, &y ) == 2 )

와:

int rc;

while ((rc = fscanf(f, "%d %d", &x, &y)) == 2)
{
    …
}

if (rc == EOF)
    …report EOF…
else
    …report format error…

else절 때문에 파일의 숫자가 아닌 데이터의 트리거, 또는이 있었기 때문에 숫자가 어딘가를 누락 될 수 있습니다. 참고 scanf()한 줄에 50 공간 구분 번호가 있으며, 각 좌표 나 별도 또는 레이아웃 중 하이브리드 혼란 20 개 내지 빈 행이 있는지해도 상관 없다.

줄 단위로 읽고보고하려면 user3386109답변 에서 나온 아이디어 와 추가 조정 을 사용 하는 것이 좋습니다 .

char line[4096];
int rc;
int pos;

while (fgets(line, sizeof(line), stdin) != NULL)
{
    if ((rc = sscanf(line, "%d %d %n", &x, &y, &pos)) != 2)
    {
        …analyze for EOF or format error…
    }
    else if (line[pos] != '\0')
    {
        …trailing non-blank junk on line…
    }
    else
    {
        …all clean and tidy…
    }
}

참고 %n변환 스펙은 (따라서 검사가 아직 3이 아니다) 결과에서 계산되지 않는다. 또한에서 앞에있는 공백 %n은 괜찮지 sscanf()만 대화 형 입력에는 끔찍합니다 (사용자가 공백이 아닌 문자를 입력 할 때까지 입력이 끝나지 않음). 이러한 종류의 미묘한 세부 사항은 scanf()함수 패밀리가 초보자에게 악몽 같은 이유 입니다 (이것이 숙련 된 프로그래머에게도 쉽지 않습니다).

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

args (java)에서 파일을 읽는 동안 오류 포착

분류에서Dev

Spark에서 CSV 파일을 읽는 동안 오류 발생-Scala

분류에서Dev

Observable을 사용하는 동안 서버 오류 처리

분류에서Dev

C #에서 Excel 파일을 읽는 동안 ###### 값 가져 오기

분류에서Dev

ns-3에서 udp 처리량을 가져 오는 동안 선언 오류

분류에서Dev

Chaquopy : "No such file or directory"에서 텍스트 파일을 읽는 동안 오류 발생

분류에서Dev

R에서 csv 파일을 읽는 동안 오류가 발생했습니다.

분류에서Dev

텍스트 파일을 읽는 동안 Java에서 런타임 오류 발생

분류에서Dev

다중 처리에서 pool.map을 사용하는 동안 산세 오류

분류에서Dev

파일에서 데이터를 읽는 동안 예기치 않은 토큰 'newline'근처의 구문 오류

분류에서Dev

txt 파일에서 읽을 때 오류 처리

분류에서Dev

AWK로 파일을 처리하는 동안 오류가 발생했습니다.

분류에서Dev

CodeDom을 사용하여 컴파일하는 동안 오류 처리

분류에서Dev

Hive SQL : 문 컴파일 중 오류 : FAILED : Hive에서 처리하는 동안 SemanticException 예외

분류에서Dev

Android에서 FTP에서 파일을 다운로드하는 동안 읽기 전용 파일 시스템 오류

분류에서Dev

보안 토큰 서비스에서받은 토큰을 처리하는 동안 WCF 오류

분류에서Dev

변수에 STDOUT을 할당하는 동안 쉘 스크립트 오류 처리

분류에서Dev

AWS Lambda의 파일 시스템에서 PNG 파일을 읽는 동안 오류가 발생했습니다.

분류에서Dev

오류 원인 : XML '파일의 조기 끝'을 처리하는 동안 오류가 발생했습니다.

분류에서Dev

FileSystemWatcher.Created 이벤트를 처리하는 동안 파일 읽기 오류가 발생했습니다.

분류에서Dev

IE에서 '°'기호로 KML을 파싱하는 동안 리소스를 처리하는 동안 오류가 발생했습니다.

분류에서Dev

쉼표 값이있는 csv 데이터에서 BizTalk flatfile Disassembler를 통해 파일을 처리하는 동안 오류가 발생 함

분류에서Dev

js 파일이 동일한 디렉토리에있는 동안 모듈 오류를 찾을 수 없습니다.

분류에서Dev

C ++에서 long 및 벡터 쌍을 만드는 동안 컴파일 오류

분류에서Dev

C #에서 파일을 만드는 동안 오류가 발생했습니다.

분류에서Dev

속성을 할당하는 동안 예외를 처리하고 일대 다 관계에 오류 추가

분류에서Dev

서버 측에서 Excel 파일을 읽고 저장하는 동안 오류가 발생했습니다.

분류에서Dev

다른 디렉토리에서 헤더 파일을 참조하는 동안 오류가 발생했습니다.

분류에서Dev

GCC : 상위 디렉토리에서 파일을 링크하는 동안 링크 오류

Related 관련 기사

  1. 1

    args (java)에서 파일을 읽는 동안 오류 포착

  2. 2

    Spark에서 CSV 파일을 읽는 동안 오류 발생-Scala

  3. 3

    Observable을 사용하는 동안 서버 오류 처리

  4. 4

    C #에서 Excel 파일을 읽는 동안 ###### 값 가져 오기

  5. 5

    ns-3에서 udp 처리량을 가져 오는 동안 선언 오류

  6. 6

    Chaquopy : "No such file or directory"에서 텍스트 파일을 읽는 동안 오류 발생

  7. 7

    R에서 csv 파일을 읽는 동안 오류가 발생했습니다.

  8. 8

    텍스트 파일을 읽는 동안 Java에서 런타임 오류 발생

  9. 9

    다중 처리에서 pool.map을 사용하는 동안 산세 오류

  10. 10

    파일에서 데이터를 읽는 동안 예기치 않은 토큰 'newline'근처의 구문 오류

  11. 11

    txt 파일에서 읽을 때 오류 처리

  12. 12

    AWK로 파일을 처리하는 동안 오류가 발생했습니다.

  13. 13

    CodeDom을 사용하여 컴파일하는 동안 오류 처리

  14. 14

    Hive SQL : 문 컴파일 중 오류 : FAILED : Hive에서 처리하는 동안 SemanticException 예외

  15. 15

    Android에서 FTP에서 파일을 다운로드하는 동안 읽기 전용 파일 시스템 오류

  16. 16

    보안 토큰 서비스에서받은 토큰을 처리하는 동안 WCF 오류

  17. 17

    변수에 STDOUT을 할당하는 동안 쉘 스크립트 오류 처리

  18. 18

    AWS Lambda의 파일 시스템에서 PNG 파일을 읽는 동안 오류가 발생했습니다.

  19. 19

    오류 원인 : XML '파일의 조기 끝'을 처리하는 동안 오류가 발생했습니다.

  20. 20

    FileSystemWatcher.Created 이벤트를 처리하는 동안 파일 읽기 오류가 발생했습니다.

  21. 21

    IE에서 '°'기호로 KML을 파싱하는 동안 리소스를 처리하는 동안 오류가 발생했습니다.

  22. 22

    쉼표 값이있는 csv 데이터에서 BizTalk flatfile Disassembler를 통해 파일을 처리하는 동안 오류가 발생 함

  23. 23

    js 파일이 동일한 디렉토리에있는 동안 모듈 오류를 찾을 수 없습니다.

  24. 24

    C ++에서 long 및 벡터 쌍을 만드는 동안 컴파일 오류

  25. 25

    C #에서 파일을 만드는 동안 오류가 발생했습니다.

  26. 26

    속성을 할당하는 동안 예외를 처리하고 일대 다 관계에 오류 추가

  27. 27

    서버 측에서 Excel 파일을 읽고 저장하는 동안 오류가 발생했습니다.

  28. 28

    다른 디렉토리에서 헤더 파일을 참조하는 동안 오류가 발생했습니다.

  29. 29

    GCC : 상위 디렉토리에서 파일을 링크하는 동안 링크 오류

뜨겁다태그

보관