문제

디스크에 더 이상 공간이 없을 때까지 파일에 쓰는 짧은 C 프로그램이 있습니다.

#include <stdio.h>

int main(void) {
  char c[] = "abcdefghij";
  size_t rez;
  FILE *f = fopen("filldisk.dat", "wb");
  while (1) {
    rez = fwrite(c, 1, sizeof(c), f);
    if (!rez) break;
  }
  fclose(f);
  return 0;
}

프로그램을 실행하면 (Linux에서) 파일이 2GB에 도달하면 중지됩니다.

파일 구조로 인해 내부 제한이 있습니까?

감사.

도움이 되었습니까?

해결책

32 비트 시스템 (즉, OS는 32 비트)에서 기본적으로 Fopen과 Co는 32 비트 크기/오프셋/등으로 제한됩니다 ... 큰 파일 지원을 활성화하거나 *64 비트 옵션을 사용해야합니다.

http://www.gnu.org/software/libc/manual/html_node/opening-streams.html#index-fopen64-931

그런 다음 FS는 이것을 지원해야하지만 지방 및 기타 원시 FS를 제외하고는 모두 파일> 2GB 작성을 지원합니다.

다른 팁

파일이 2GB에 도달하면 중지됩니다.

파일 구조로 인해 내부 제한이 있습니까?

이는 LIBC (표준 C 라이브러리) 때문이며, X86 (IA-32) Linux 시스템의 기본적으로 GLIBC (GNU의 C 라이브러리)가 제공하는 32 비트 기능입니다. 그래서 기본적으로 파일 스트림 크기 32 비트 -2^(32-1)를 기준으로합니다.

사용을 위해 큰 파일 지원, 웹 페이지를 참조하십시오.

#define _FILE_OFFSET_BITS  64
/* or more commonly add -D_FILE_OFFSET_BITS=64 to CFLAGS */

#include <stdio.h>

int main(void) {
  char c[] = "abcdefghij";
  size_t rez;
  FILE *f = fopen("filldisk.dat", "wb");
  while (1) {
    rez = fwrite(c, 1, sizeof(c), f);
    if ( rez < sizeof(c) ) { break; }
  }
  fclose(f);
  return 0;
}

참고 : 대부분의 시스템은 FOPEN (및 OFF_T)이 2^31 파일 크기 제한을 기반으로 할 것으로 예상합니다. 교체합니다 off64_t 그리고 fopen64 이것을 명시 적으로 만들고 그리고 사용법에 따라가는 것이 가장 좋은 방법 일 수 있습니다. 그러나 일반적으로 비표준이므로 권장하지 않습니다.

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