Domanda

Ho un breve programma C che scrive in un file fino a quando non v'è più spazio su disco:

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

Quando eseguo il programma (in Linux), si ferma quando il file raggiunge 2 GB.

C'è una limitazione interna, a causa della struttura del file, o qualcosa del genere?

Grazie.

È stato utile?

Soluzione

In un sistema a 32 bit (vale a dire il sistema operativo è di 32 bit), per impostazione predefinita, fopen e co sono limitati a 32 bit dimensioni / offset / ecc ... È necessario attivare il supporto del file, o utilizzare il * 64 opzione bit:

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

Allora il tuo fs ha la necessità di sostenere questo, ma tranne fs primitivi grassi e altri, tutti supportano la creazione di file> 2 gb.

Altri suggerimenti

  

si ferma quando il file raggiunge 2 GB.

     

C'è una limitazione interna, a causa   alla struttura dei file, o qualcosa del genere?

Questo è dovuto alla libc (la libreria standard C), che di default su un x86 (IA-32) Sistema di Linux è funzioni a 32 bit fornite da glibc (C Library di GNU). Quindi per default il dimensioni flusso di file si basa su 32-bit -. 2 ^ (32-1)

Per usare Large File Support , vedere la pagina Web.

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

Nota: La maggior parte dei sistemi si aspettano fopen (e off_t) a basarsi su limite di dimensione 2 ^ 31 file. La loro sostituzione con off64_t e fopen64 rende esplicito, e a seconda dell'uso potrebbe essere il modo migliore per andare. , ma non è raccomandato, in generale, in quanto sono non standard.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top