Question

J'ai un programme court C qui écrit dans un fichier jusqu'à ce qu'il n'y a pas plus d'espace sur le disque:

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

Quand je lance le programme (sous Linux), il arrête lorsque le fichier atteint 2 Go.

Y at-il une limite interne, en raison de la structure du fichier, ou quelque chose?

Merci.

Était-ce utile?

La solution

Sur un système 32 bits (à savoir le système d'exploitation est de 32 bits), par défaut, fopen et co sont limités à 32 taille bits / offset / etc ... Vous devez activer le support des grands fichiers, ou utiliser le * 64 possibilité de bits:

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

Ensuite, votre fs doit prendre en charge, mais à l'exception de graisse et d'autres fs primitifs, tous les fichiers> supportent la création de 2 Go.

Autres conseils

  

il arrête lorsque le fichier atteint 2 Go.

     

Y at-il une limitation interne, en raison   à la structure du fichier, ou quelque chose?

Ceci est dû à la libc (la bibliothèque standard C), qui par défaut sur un x86 (IA-32) Le système Linux est fonction de 32 bits fournis par glibc (Bibliothèque GNU C). Donc, par défaut, le taille du flux de fichier est basée sur 32 bits -. 2 ^ (32-1)

Pour utiliser Grand Support de fichiers, consultez la page 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;
}

Note: La plupart des systèmes attendent fopen (et off_t) soient basées sur 2 ^ 31 limite de taille de fichier. en les remplaçant par off64_t et fopen64 en fait explicite, et selon l'utilisation pourrait être le meilleur moyen d'aller. mais n'est pas recommandé en général car ils ne sont pas standard.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top