c - 함수 - fwrite




C에서 파일의 크기를 어떻게 결정합니까? (10)

POSIX

POSIX 표준에는 파일 크기를 가져 오는 고유 한 방법이 있습니다.
이 기능을 사용하려면 sys/stat.h 헤더를 포함하십시오.

개요

  • stat(3) 사용하여 파일 통계를 가져 stat(3) .
  • st_size 특성을 확보하십시오.

참고 : 크기는 4GB 제한됩니다. Fat32 파일 시스템이 아닌 경우 64 비트 버전을 사용하십시오!

#include <stdio.h>
#include <sys/stat.h>

int main(int argc, char** argv)
{
    struct stat info;
    stat(argv[1], &info);

    // 'st' is an acronym of 'stat'
    printf("%s: size=%ld\n", argv[1], info.st_size);
}
#include <stdio.h>
#include <sys/stat.h>

int main(int argc, char** argv)
{
    struct stat64 info;
    stat64(argv[1], &info);

    // 'st' is an acronym of 'stat'
    printf("%s: size=%ld\n", argv[1], info.st_size);
}

ANSI C (표준)

ANSI C 는 파일 길이를 결정하는 방법을 직접 제공하지 않습니다.
우리는 마음을 사용해야합니다. 지금, 우리는 탐색 접근법을 사용할 것입니다!

개요

  • fseek(3) 사용하여 파일을 끝까지 찾으십시오.
  • ftell(3) 사용하여 현재 위치를 가져옵니다.

#include <stdio.h>

int main(int argc, char** argv)
{
    FILE* fp = fopen(argv[1]);
    int f_size;

    fseek(fp, 0, SEEK_END);
    f_size = ftell(fp);
    rewind(fp); // to back to start again

    printf("%s: size=%ld", (unsigned long)f_size);
}

파일이 stdin 또는 파이프 인 경우 POSIX, ANSI C 가 작동하지 않습니다.
파일이 파이프 또는 stdin 경우 0 반환합니다.

의견 : 대신 POSIX 표준을 사용해야합니다. 64 비트를 지원하기 때문입니다.

바이트 단위로 파일 크기를 어떻게 알 수 있습니까?

#include <stdio.h>

unsigned int fsize(char* file){
  //what goes here?
}

**이 작업을 수행하지 마십시오 ( why? ) :

온라인에서 찾은 C99 표준 문서 인용 : " fseek(file, 0, SEEK_END) 와 같이 파일 위치 표시기를 파일 끝으로 설정하면 이진 스트림에 대해 정의되지 않은 동작이 있습니다 (후행 널 문자가 발생할 수 있기 때문에) 또는 초기 시프트 상태로 확실하게 끝나지 않는 상태 종속 인코딩이있는 스트림의 경우 **

오류 메시지가 전송 될 수 있도록 정의를 int로 변경 한 후 fseek()ftell() 을 사용하여 파일 크기를 판별하십시오.

int fsize(char* file) {
  int size;
  FILE* fh;

  fh = fopen(file, "rb"); //binary mode
  if(fh != NULL){
    if( fseek(fh, 0, SEEK_END) ){
      fclose(fh);
      return -1;
    }

    size = ftell(fh);
    fclose(fh);
    return size;
  }

  return -1; //error
}

Matt의 솔루션은 C 대신 C ++이라는 점을 제외하고는 작동해야하며 초기 텔은 필요하지 않습니다.

unsigned long fsize(char* file)
{
    FILE * f = fopen(file, "r");
    fseek(f, 0, SEEK_END);
    unsigned long len = (unsigned long)ftell(f);
    fclose(f);
    return len;
}

중괄호도 당신을 위해 고쳤습니다. ;)

업데이트 : 이것은 실제로 최고의 솔루션은 아닙니다. Windows에서는 4GB 파일로 제한되며 GetFileSizeEx 또는 stat64 와 같은 플랫폼 별 호출을 사용하는 것보다 느릴 수 있습니다.


NilObject의 코드를 기반으로 :

#include <sys/stat.h>
#include <sys/types.h>

off_t fsize(const char *filename) {
    struct stat st; 

    if (stat(filename, &st) == 0)
        return st.st_size;

    return -1; 
}

변경 사항 :

  • 파일 이름 인수를 const char 만들었습니다.
  • 변수 이름이 누락 된 struct stat 정의를 수정했습니다.
  • 빈 파일에 대해 모호한 0 대신 오류시 -1 을 반환합니다. off_t 는 부호있는 유형이므로 가능합니다.

fsize() 가 오류시 메시지를 인쇄하도록하려면 다음을 사용할 수 있습니다.

#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>

off_t fsize(const char *filename) {
    struct stat st;

    if (stat(filename, &st) == 0)
        return st.st_size;

    fprintf(stderr, "Cannot determine size of %s: %s\n",
            filename, strerror(errno));

    return -1;
}

32 비트 시스템에서는 -D_FILE_OFFSET_BITS=64 옵션으로 -D_FILE_OFFSET_BITS=64 컴파일해야합니다. 그렇지 않으면 off_t 는 최대 2GB의 값만 보유합니다. 자세한 내용은 Linux에서 큰 파일 지원 의 "LFS 사용"섹션을 참조하십시오.


std c 라이브러리를 사용하는 것이 좋다면 :

#include <sys/stat.h>
off_t fsize(char *file) {
    struct stat filestat;
    if (stat(file, &filestat) == 0) {
        return filestat.st_size;
    }
    return 0;
}

다음은 파일 크기를 반환하는 간단하고 깔끔한 함수입니다.

long get_file_size(char *path)
{
    FILE *fp;
    long size = -1;
    /* Open file for reading */
    fp = fopen(path, "r");
    fseek(fp, 0, SEEK_END);
    size = ftell(fp); 
    fp.close();
    return 
}

이 코드 세트를 사용하여 파일 길이를 찾았습니다.

//opens a file with a file descriptor
FILE * i_file;
i_file = fopen(source, "r");

//gets a long from the file descriptor for fstat
long f_d = fileno(i_file);
struct stat buffer;
fstat(f_d, &buffer);

//stores file size
long file_length = buffer.st_size;
fclose(i_file);

질문을 보면, ftell 은 바이트 수를 쉽게 얻을 수 있습니다.

  long size ;
  size = ftell(FILENAME);
  printf("total size is %ld bytes",size);

int 사용하지 마십시오. 크기가 2 기가 바이트를 초과하는 파일은 요즘 먼지처럼 일반적입니다.

unsigned int 사용하지 마십시오. 크기가 4 기가 바이트를 넘는 파일은 약간 덜 일반적인 먼지로 일반적입니다.

IIRC 표준 라이브러리는 off_t 를 부호없는 64 비트 정수로 정의하므로 모든 사람이 사용해야합니다. 우리는 16 엑사 바이트 파일을 가지고 시작했을 때 몇 년 안에 128 비트로 재정의 할 수 있습니다.

Windows를 사용하는 경우 GetFileSizeEx 를 사용해야합니다. 실제로 부호있는 64 비트 정수를 사용하므로 8 엑사 바이트 파일에 문제가 발생하기 시작합니다. 어리석은 Microsoft! :-)


stdio.h 만 잘 작동하는 기능이 있습니다. 나는 그것을 많이 좋아하고 매우 잘 작동하며 꽤 간결합니다.

size_t fsize(FILE *File) {
    size_t FSZ;
    fseek(File, 0, 2);
    FSZ = ftell(File);
    rewind(File);
    return FSZ;
}




filesize