문제

파일 크기를 바이트 단위로 어떻게 알 수 있나요?

#include <stdio.h>

unsigned int fsize(char* file){
  //what goes here?
}
도움이 되었습니까?

해결책

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 변수 이름이 누락된 정의입니다.
  • 보고 -1 오류가 발생하면 대신 0, 빈 파일의 경우 모호합니다. 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, 그렇지 않으면 off_t 최대 2GB의 값만 보유합니다."LFS 사용" 섹션을 참조하세요. Linux의 대용량 파일 지원 자세한 내용은.

다른 팁

사용하지 마세요 int.요즘에는 2GB가 넘는 파일이 먼지처럼 흔합니다.

사용하지 마세요 unsigned int.크기가 4GB를 초과하는 파일은 약간 덜 일반적인 먼지로 일반적입니다.

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

당신이 창문에 있다면, 당신은 사용해야합니다 GetFileSizeEx - 실제로는 부호 있는 64비트 정수를 사용하므로 8엑사바이트 파일에 문제가 발생하기 시작합니다.어리석은 마이크로소프트!:-)

Matt의 솔루션은 작동해야 합니다. 단, C 대신 C++이고 초기 Tell이 필요하지 않아야 합니다.

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.

**이러지 마세요 (왜?):

온라인에서 찾은 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
}

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;
}

POSIX

그만큼 POSIX 표준에는 파일 크기를 얻는 자체 방법이 있습니다.
포함 sys/stat.h 기능을 사용하기 위한 헤더입니다.

개요

  • 다음을 사용하여 파일 통계 얻기 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 작동하지 않습니다.
돌아올거야 0 파일이 파이프이거나 stdin.

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

Windows 앱을 구축하는 경우 다음을 사용하세요. GetFileSizeEx CRT 파일 I/O로서의 API는 특히 파일 길이를 결정하는 데 있어 다른 시스템의 파일 표현의 특성으로 인해 지저분합니다.)

Google에서 빠르게 검색하여 찾았습니다. fseek 및 ftell을 사용하는 방법 그리고 이 질문이 있는 스레드에는 다른 방법으로는 C만으로는 수행할 수 없다는 답변이 포함되어 있습니다.

다음과 같은 이식성 라이브러리를 사용할 수 있습니다. NSPR (Firefox를 지원하는 라이브러리) 또는 확인 구현 (다소 털이 많은).

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

//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);

이 시도 --

fseek(fp, 0, SEEK_END);
unsigned long int file_size = ftell(fp);
rewind(fp);

이것이 하는 일은 먼저 파일의 끝을 찾는 것입니다.그런 다음 파일 포인터가 어디에 있는지 보고하십시오.마지막으로(선택 사항) 파일의 시작 부분으로 되감습니다.참고하세요 fp 바이너리 스트림이어야 합니다.

file_size에는 파일에 포함된 바이트 수가 포함됩니다.(climits.h에 따르면) unsigned long 유형은 4294967295바이트(4GB)로 제한되므로 이보다 큰 파일을 처리하려는 경우 다른 변수 유형을 찾아야 합니다.

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

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 
}

파일의 세부 정보를 검색하려면 라이브러리 함수를 사용해야 합니다.C는 완전히 플랫폼 독립적이므로 어떤 플랫폼/운영 체제를 개발하고 있는지 알려주셔야 합니다!

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

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

파일을 열 수 있으며 다음을 사용하여 파일 하단에서 0 오프셋으로 이동할 수 있습니다.

#define SEEKBOTTOM   2

fseek(handle, 0, SEEKBOTTOM)  

fseek에서 반환된 값은 파일 크기입니다.

나는 오랫동안 C로 코딩을 하지 않았지만 그것이 작동할 것이라고 생각합니다.

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