C로 파일 크기를 얻으려면 어떻게해야합니까? [복제]
가능한 중복 :
C에서 파일의 크기를 어떻게 결정합니까?
C로 작성된 응용 프로그램으로 열린 파일의 크기를 어떻게 알 수 있습니까? 로드 된 파일의 내용을 문자열에 넣기를 원하기 때문에 크기를 알고 싶습니다 malloc()
. malloc(10000*sizeof(char));
IMHO를 쓰는 것은 나쁜 생각입니다.
파일의 끝 부분을 찾은 다음 위치를 요청해야합니다.
fseek(fp, 0L, SEEK_END);
sz = ftell(fp);
그런 다음 다시 찾을 수 있습니다.
fseek(fp, 0L, SEEK_SET);
또는 (처음에 가려고하는 경우)
rewind(fp);
표준 라이브러리 사용 :
구현이 의미 적으로 SEEK_END를 지원한다고 가정합니다.
fseek(f, 0, SEEK_END); // seek to end of file
size = ftell(f); // get current file pointer
fseek(f, 0, SEEK_SET); // seek back to beginning of file
// proceed with allocating memory and reading the file
리눅스 / POSIX :
stat
(파일 이름을 알고있는 경우) 또는 fstat
(파일 설명자가있는 경우 )를 사용할 수 있습니다 .
stat의 예는 다음과 같습니다.
#include <sys/stat.h>
struct stat st;
stat(filename, &st);
size = st.st_size;
Win32 :
GetFileSize 또는 GetFileSizeEx를 사용할 수 있습니다 .
파일 디스크립터 fstat()
가있는 경우 파일 크기가 포함 된 통계 구조를 리턴합니다.
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
// fd = fileno(f); //if you have a stream (e.g. from fopen), not a file descriptor.
struct stat buf;
fstat(fd, &buf);
off_t size = buf.st_size;
짧고 달콤한 fsize
기능을 만들었습니다 (참고, 오류 검사 없음)
int fsize(FILE *fp){
int prev=ftell(fp);
fseek(fp, 0L, SEEK_END);
int sz=ftell(fp);
fseek(fp,prev,SEEK_SET); //go back to where we were
return sz;
}
표준 C 라이브러리에 그러한 기능이 없다는 것은 어리석은 일이지만 모든 "파일"에 크기가있는 것은 왜 어려운지 알 수 있습니다 (예 /dev/null
:)
사용 방법 lseek의 / fseek과 / 합계 / fstat를 파일 크기 얻을?
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
void
fseek_filesize(const char *filename)
{
FILE *fp = NULL;
long off;
fp = fopen(filename, "r");
if (fp == NULL)
{
printf("failed to fopen %s\n", filename);
exit(EXIT_FAILURE);
}
if (fseek(fp, 0, SEEK_END) == -1)
{
printf("failed to fseek %s\n", filename);
exit(EXIT_FAILURE);
}
off = ftell(fp);
if (off == (long)-1)
{
printf("failed to ftell %s\n", filename);
exit(EXIT_FAILURE);
}
printf("[*] fseek_filesize - file: %s, size: %ld\n", filename, off);
if (fclose(fp) != 0)
{
printf("failed to fclose %s\n", filename);
exit(EXIT_FAILURE);
}
}
void
fstat_filesize(const char *filename)
{
int fd;
struct stat statbuf;
fd = open(filename, O_RDONLY, S_IRUSR | S_IRGRP);
if (fd == -1)
{
printf("failed to open %s\n", filename);
exit(EXIT_FAILURE);
}
if (fstat(fd, &statbuf) == -1)
{
printf("failed to fstat %s\n", filename);
exit(EXIT_FAILURE);
}
printf("[*] fstat_filesize - file: %s, size: %lld\n", filename, statbuf.st_size);
if (close(fd) == -1)
{
printf("failed to fclose %s\n", filename);
exit(EXIT_FAILURE);
}
}
void
stat_filesize(const char *filename)
{
struct stat statbuf;
if (stat(filename, &statbuf) == -1)
{
printf("failed to stat %s\n", filename);
exit(EXIT_FAILURE);
}
printf("[*] stat_filesize - file: %s, size: %lld\n", filename, statbuf.st_size);
}
void
seek_filesize(const char *filename)
{
int fd;
off_t off;
if (filename == NULL)
{
printf("invalid filename\n");
exit(EXIT_FAILURE);
}
fd = open(filename, O_RDONLY, S_IRUSR | S_IRGRP);
if (fd == -1)
{
printf("failed to open %s\n", filename);
exit(EXIT_FAILURE);
}
off = lseek(fd, 0, SEEK_END);
if (off == (off_t)-1)
{
printf("failed to lseek %s\n", filename);
exit(EXIT_FAILURE);
}
printf("[*] seek_filesize - file: %s, size: %lld\n", filename, off);
if (close(fd) == -1)
{
printf("failed to close %s\n", filename);
exit(EXIT_FAILURE);
}
}
int
main(int argc, const char *argv[])
{
int i;
if (argc < 2)
{
printf("%s <file1> <file2>...\n", argv[0]);
exit(0);
}
for(i = 1; i < argc; i++)
{
seek_filesize(argv[i]);
stat_filesize(argv[i]);
fstat_filesize(argv[i]);
fseek_filesize(argv[i]);
}
return 0;
}
파일 크기를 계산하지 않고 필요한 경우 배열을 늘리는 것을 고려 했습니까? 다음은 오류 점검이 생략 된 예입니다.
#define CHUNK 1024
/* Read the contents of a file into a buffer. Return the size of the file
* and set buf to point to a buffer allocated with malloc that contains
* the file contents.
*/
int read_file(FILE *fp, char **buf)
{
int n, np;
char *b, *b2;
n = CHUNK;
np = n;
b = malloc(sizeof(char)*n);
while ((r = fread(b, sizeof(char), CHUNK, fp)) > 0) {
n += r;
if (np - n < CHUNK) {
np *= 2; // buffer is too small, the next read could overflow!
b2 = malloc(np*sizeof(char));
memcpy(b2, b, n * sizeof(char));
free(b);
b = b2;
}
}
*buf = b;
return n;
}
이것은 파일 크기 (stdin과 같은)를 얻는 것이 불가능한 스트림에서도 작업 할 수 있다는 장점이 있습니다.
Linux를 사용하는 경우 glib 에서 g_file_get_contents 함수를 사용하는 것이 중요 합니다. 파일로드, 메모리 할당 및 오류 처리를위한 모든 코드를 처리합니다.
#include <stdio.h>
#define MAXNUMBER 1024
int main()
{
int i;
char a[MAXNUMBER];
FILE *fp = popen("du -b /bin/bash", "r");
while((a[i++] = getc(fp))!= 9)
;
a[i] ='\0';
printf(" a is %s\n", a);
pclose(fp);
return 0;
}
HTH
참고 URL : https://stackoverflow.com/questions/238603/how-can-i-get-a-files-size-in-c
'development' 카테고리의 다른 글
C #이 % AppData %의 경로를 얻는 중 (0) | 2020.02.28 |
---|---|
Xcode 9“iPhone이 사용 중 : iPhone에 대한 디버거 지원 준비” (0) | 2020.02.28 |
val ()을 사용하여 select 값을 설정할 때 jquery change 이벤트가 트리거되지 않는 이유는 무엇입니까? (0) | 2020.02.27 |
HTML 컨테이너에 여러 클래스를 할당하는 방법은 무엇입니까? (0) | 2020.02.27 |
VSCode에서 단어 줄 바꿈을 켜고 끄는 방법은 무엇입니까? (0) | 2020.02.27 |