>


파일을 읽을 수있는이 작은 함수에 문제가 있습니다 :

void ReadFile(char *name) {
FILE *fr;
int lenght, i;
fr = fopen(name, "r");  //Open the file reader
fseek(fr, 0, 2);        //Set the pointer at the EOF
lenght = ftell(fr);     //Read the ending position
printf("\nDEBUG lenght:%d\n", lenght);
fseek(fr, 0, 0);        //Return at the beginning of the file
printf("File read:\n\n");
for (i = 1; i <= lenght; i++) {
    printf("%c", getc(fr));
    fseek(fr, i, 0);
}
fclose(fr);
}

이 파일은 다음과 같습니다.

qwerty
asdfgh
zxcvbn

그러나 이것은 프로그램의 출력입니다 :

DEBUG lenght:24
File read:
qwerty

asdfgh
zxcvbn

이전에는 기본적으로 여분의 "\ n"을 읽습니다.
코드가 작동하지 않는 이유에 대한 아이디어가 있습니까?

감사합니다


  • 답변 # 1

    텍스트 모드에서 파일을 열면 (위와 같이) fseek 에 대한 호출   ftell 가 이전에 검색 한 오프셋 값만 포함 할 수 있습니다.  함수 (예 : cppreference/fseek) :

    와이즈 비즈 당신의

    If the stream is open in text mode, the only supported values for offset are zero (which works with any origin) and a value returned by an earlier call to ftell on a stream associated with the same file (which only works with origin of SEEK_SET).

    에서 -loop, 그러나 for 의 값을 전달합니다 i 에 의해 검색되지 않습니다. .

    그 외에도 당신의 ftell  루프에서 fseek 로 superflous입니다  어쨌든 읽기 포인터를 앞으로 이동시킵니다. 그래서 fgetc  작업을 수행해야합니다.

  • 답변 # 2

    다음 제안 된 코드 :

    <올>

    정확하게 컴파일

    원하는 기능을 수행합니다

    적절한 오류 확인

    현재 제안 된 코드 :

    for (i = 1; i <= lenght; i++) { printf("%c", getc(fr)); }
    
    
    #include <stdio.h> // EOF, fopen(), getc(), putc() fclose() puts() perror() #include <stdlib.h> // exit(), EXIT_FAILURE // prototype void ReadFile(char *filename); void ReadFile(char *filename) { FILE *fp = fopen( filename, "r" ); if( !fp ) { perror( "fopen failed" ); exit( EXIT_FAILURE ); } // implied else, fopen successful puts("File read:\n"); int ch; while( (ch = getc( fp )) != EOF ) { putchar( ch ); } fclose(fp); }

  • 이전 nginx - 호스트 및 경로가 아닌 GCE LoadBalancer와 함께 Google Cloud Storage Bucket 사용
  • 다음 R for loop print와 writecsv에서 다른 결과를 얻는 이유는 무엇입니까?