Pourquoi mon programme ne peut-il pas enregistrer une grande quantité (> 2 Go) dans un fichier?

Je ne parviens pas à comprendre pourquoi mon programme ne peut pas enregistrer plus de 2 Go de données dans un fichier. Je ne peux pas dire s’il s’agit d’un problème de programmation ou d’environnement (OS). Voici mon code source:

#define _LARGEFILE_SOURCE #define _LARGEFILE64_SOURCE #define _FILE_OFFSET_BITS 64 #include  #include  #include  #include  #include  #include  /*-------------------------------------*/ //for file mapping in Linux #include #include #include #include #include #include /*-------------------------------------*/ #define PERMS 0600 #define NEW(type) (type *) malloc(sizeof(type)) #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) void write_result(char *filename, char *data, long long length){ int fd, fq; fd = open(filename, O_RDWR|O_CREAT|O_LARGEFILE, 0644); if (fd < 0) { perror(filename); return -1; } if (ftruncate(fd, length) %lld\n",strlen(ttt)); // length=0 memset (ttt,1,offset); printf("length->%lld\n",strlen(ttt)); // length=3GB write_result("test.big",ttt,offset); return 1; } 

Selon mon test, le programme peut générer un fichier de plus de 2 Go et allouer également une telle mémoire. La chose étrange s’est produite lorsque j’ai essayé d’écrire des données dans le fichier. J’ai vérifié le fichier et il est vide, ce qui est censé être rempli avec 1.

Quelqu’un peut-il être gentil et m’aider avec ça?

    Vous devez en savoir un peu plus sur les chaînes de Do et sur ce que font et malloc et calloc .

    Dans votre ttt main origine, ttt sur la mémoire que vous malloc appelée quand malloc été appelé. Cela signifie qu’un terminateur nul (le marqueur de fin d’une chaîne C, qui est un binary 0) pourrait se trouver n’importe où dans la corbeille renvoyée par malloc .

    De plus, étant donné que malloc ne touche pas tous les octets de la mémoire allouée (et vous en demandez beaucoup), vous pourriez obtenir une mémoire insuffisante, ce qui signifie que la mémoire n’est pas physiquement disponible tant qu’elle n’a pas été lue ou écrite.

    calloc alloue et remplit la mémoire allouée avec 0. Il est un peu plus enclin à échouer pour cette raison (il touche chaque octet alloué, donc si le système d’exploitation laisse l’allocation éparse, il ne le sera plus après que calloc rempli.)

    Voici votre code avec des correctifs pour les problèmes ci-dessus. Vous devez également toujours vérifier la valeur de retour de write et réagir en conséquence. Je vous laisse ça …

     principale()
     {
         décalage long long = 3000000000;  // 3 Go
         char * ttt;
         // ttt = (char *) malloc (sizeof (char) * offset);
         ttt = (char *) calloc (sizeof (char), offset);  // au lieu de malloc (...)
         si (! ttt)
         {
             met ("calloc a échoué, au revoir maintenant!");
             sortie (87);
         }
    
         printf ("longueur ->% lld \ n", strlen (ttt));  // longueur = 0 (Cela fonctionne maintenant comme prévu si calloc n'échoue pas)
         memset (ttt, 1, offset);
         ttt [offset - 1] = 0;  // Maintenant, rien n'est terminé et le printf ci-dessous fonctionnera
         printf ("longueur ->% lld \ n", strlen (ttt));  // longueur = 3 Go
         write_result ("test.big", ttt, offset);
         retourne 1;
     }
    

    Note aux gourous de Linux … Je sais que clairsemé n’est peut-être pas le terme correct. S’il vous plaît, corrigez-moi si je me trompe, car cela fait longtemps que je n’ai pas été enterré dans les minuties de Linux. 🙂

    On dirait que vous respectez la limite du système de fichiers interne pour iDevice: ios – Application d’entreprise avec plus de 2 Go de ressources.

    Les fichiers 2Gb + ne sont tout simplement pas possibles. Si vous avez besoin de stocker une telle quantité de données, envisagez d’utiliser d’autres outils ou écrivez le gestionnaire de morceaux de fichiers.

    Je vais m’exprimer et dire que votre problème peut résider dans memset ().

    La meilleure chose à faire ici est, je pense, après le memset (),

     for (unsigned long i = 0; i < 3000000000; i++) { if (ttt[i] != 1) { printf("error in data at location %d", i); break; } } 

    Une fois que vous avez vérifié que les données que vous essayez d'écrire sont correctes, vous devriez alors envisager d'écrire un fichier plus petit, tel que 1 Go, et voir si vous avez les mêmes problèmes. Éliminez chaque variable possible et vous trouverez la réponse.