Fscanf 함수는 예상대로 연속된 줄을 읽지 않습니다.

이 문서에서는 함수를 사용하여 Fscanf 텍스트 줄을 읽을 때 발생하는 문제를 설명합니다.

원래 제품 버전: Visual C
원래 KB 번호: 60336

요약

텍스트 모드에서 파일을 열면 함수를 사용하여 Fscanf 텍스트 줄을 읽으려는 시도가 실패할 수 있으며 파일에서 한 줄의 텍스트만 읽습니다. 구분 기호가 .로 설정됩니다 [^\n]. 함수는 Fscanf 최대로 읽지만 구분 문자를 포함하지 않습니다. 따라서 파일 스트림은 파일의 첫 번째 \n 스트림에서 중지됩니다. 파일 포인터가 구분 문자에 남아 있고 Fscanf 함수가 함수 포인터를 지나서 앞으로 나아갈 수 없으므로 후속 Fscanf 함수 호출이 실패합니다. 구분 문자를 지나 파일 포인터를 이동하려면 다음 두 가지 방법 중 하나를 사용합니다.

  • 다음 함수 호출을 사용하도록 코드를 업데이트합니다 Fscanf .

    fscanf(stream, "%[^\n]%*c", line)
    

    %*c 형식 지정자는 입력 스트림에서 한 문자를 읽지만 함수 호출의 매개 변수에 fscanf 할당하지 않습니다.

  • 함수 호출 Fgetc 후 함수를 Fscanf 호출하여 파일 포인터를 문자 이상으로 \n 이동합니다.

다음 코드 샘플에서는 이 문제를 보여 줍니다. 코드 샘플은 EOF에 도달할 때까지 텍스트 파일에서 줄을 읽고 인쇄해야 합니다. 그러나 코드 샘플은 파일에서 첫 번째 줄만 읽습니다. 파일 문자의 끝을 찾을 수 없으므로 파일 스트림에 문자가 포함된 경우 코드 샘플이 무한 루프에서 \n 실행됩니다.

코드 샘플

FILE *stream;
char line[80];

while ((fscanf(stream, "%[^\n]", line))!= EOF )
{
    printf("Line = %s \n",line);
}

다음 코드 예제에서는 이 문제를 해결하기 위해 위의 두 번째 방법을 보여 줍니다.

FILE *stream;
char line[80];

while ((fscanf(stream, "%[^\n]", line))!= EOF)
{
    fgetc(stream); // Reads in '\n' character and moves file
    // stream past delimiting character
    printf("Line = %s \n", line);
}