문제

프로그램을 실행하고 제품 목록을 보려고 선택했는데 아무 것도 인쇄되지 않습니다.시간이 지나고 나서 나는 그 가치를 알게 되었다. fl_size 항상 0입니다.왜 이런거야?

void view_prdct_code_list() {
        FILE *stock = fopen("stock.dat","r+");
        assert(stock);

        int fl_size=ftell(stock);
        int prd_size= sizeof(product);
        int quantity= fl_size/prd_size;
        printf("fl_size=%d",fl_size);

        fseek(stock,0,SEEK_SET);
        prdct cprd= (product *)malloc (sizeof(product)*quantity);
        assert(cprd);

        int i;

        fread(cprd,prd_size,quantity,stock);

        for (i=0;i<quantity;i++){
                printf("PRODUCT CODE: %d\n",cprd->code);
        }

        free(cprd);
        fclose(stock);
}
도움이 되었습니까?

해결책

ftell 파일의 전체 크기를 반환하지 않습니다.그것은 현재를 반환 읽기 또는 쓰기 위치 파일 내에서.당신이 전화 ftell 파일을 연 직후이므로 해당 위치는 파일의 시작 부분입니다.다음 중 하나를 사용할 수 있습니다. fseek(stock, 0, SEEK_END) 부르기 전에 끝까지 추구하라 ftell, 또는 레이어를 드롭다운하고 다음을 사용할 수 있습니다. fstat(fileno(stock)) OS에서 직접 파일 크기를 검색합니다.

추가 참고사항:

  1. 파이프에서 읽는 경우에는 이 옵션 중 어느 것도 작동하지 않습니다.(일반적으로 파일 액세스 작업이 모두 성공했는지 확인해야 합니다.)
  2. fread 요청하더라도 한 번에 전체 파일을 읽는다는 보장은 없습니다.
  3. '알크'가 지적하듯이, ftell 반환합니다 long, 아니 int.
  4. 이 바이너리 파일을 모드로 열어야 합니다. "r+b".
  5. 파일 헤더가 없는 바이너리 파일(특히 헤더가 없는 바이너리 파일) 매직넘버, 오프셋 0에서 최소 4바이트)는 나쁜 것입니다.
  6. 반환 값을 캐스팅하지 마십시오. malloc.(C++에서는 꼭 필요한 일이지만, C에서는 불필요할 뿐만 아니라, 버그를 숨길 수 있습니다.)

다른 팁

ftell의 맨 페이지 (예 : "Nofollow Noreferrer"> http : //linux.die.net / man / 3 / ftell

여기서는 관련 부분입니다. "FTELL () 함수는 스트림에 의해 가리키는 스트림에 대한 파일 위치 표시기의 현재 값을 얻습니다."

파일을 열면 커서 위치가 시작됩니다.그래서 시작에서 거리가 0이 될 것입니다.따라서 ftell는 0을 반환합니다.

파일의 크기를 찾으려면 다음 링크를 참조하십시오. C? 에서 파일의 크기를 어떻게 얻을 수 있습니까?짧은 스 니펫이 있습니다 :

fseek(fp, 0L, SEEK_END);
sz = ftell(fp);
.

위의 후에 fseek(fp, 0L, SEEK_SET);를 호출하십시오.

Because ftell returns the size from the beginning to the current position of the file.

fseek(stock,0,SEEK_SET);

Means you set the position to the first bite of the file.

Also you gotta set fl_size=ftell(stock); after the fseek.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top