9
votes

Comment: Système transversal-Système grand fichier io in c?

en bref: Système transversal, un support de gros fichier en C est horrible.

Objectif: J'essaie d'avoir "à sens unique" (la plus probable macro basée) pour permettre 32 bits et 64 bits d'avoir un support de fichier important. Idéalement avec TypeDEF, # IFDEF'S, # (N) défini, etc une wrapper macro pouvant permettre une prise en charge de base du fichier volumique sous la forme d'une bibliothèque #include ou d'un ensemble de macros définies.

Recherche: Les opérations de fichier de POSIX effectuent de superbes BSD / MAC / Linux pour 32 et 64 bits IO avec des fichiers supérieurs à la taille de 2 ^ 31, mais même avec clang ou mingw sous Windows Je ne peux pas tirer parti de ces appels en raison de la mise en œuvre stupide de M $ de POSIX (si c'est ce que nous voulons l'appeler ...). Je suis penché vers l'utilisation de Createefile (), ReadFile (), Wallfile () sur Windows, mais ceci est complètement différent de celui de POSIX () / lecture () / lue () / écriture () / ferme () /, etc., en termes de méthodologie et de types de données utilisé.

question: Après avoir frappé ma tête contre mon clavier et plusieurs livres de texte, j'ai décidé de sonder tous à vous de voir: Comment allez-vous gars / gals accomplir le fichier Cross OS E / S qui prend en charge les gros fichiers?

P.s. J'ai des liens de recherche:


0 commentaires

3 Réponses :


1
votes

Il semble que vous avez besoin d'une version différente de MINGW:

http://mingw-w64.sourceforge.net/

La variante W64 a un support de fichier grand compatible Linux, même sur des fenêtres 32b.


0 commentaires

0
votes

Autant que nous aimons tous haïr sur M $ pour leur conformité de normes de merde, celui-ci était en réalité la faute du Comité ISO C. À l'origine, ils ont utilisé Taille_T pour tous les paramètres de fichier, mais Taille_t est choisi en fonction de l'architecture Alu / Memory et non basé sur les capacités de manutention du fichier OS. Lorsque tout le monde passait dans des processeurs de 64 bits, Mme bloquée avec une longue durée de 32 bits, qu'ils étaient parfaitement autorisées à faire et à être toujours conformes, mais maintenant leurs fichiers sont plus gros que leur plus gros type arithmétique.

Notez que cela a finalement été Résolu en C99, mais le support MSVC C99 est essentiellement inexistant.

En interne, cependant, ils utilisent réellement un pointeur 64 bits pour suivre votre position dans le fichier. Le problème est dû à l'API malheureuse CSTDLIB que vous ne pouvez pas utiliser "FSEAK" ou "FTELL" pour quelque chose de plus grand que 32 bits.

Pour démontrer que Windows utilise réellement un pointeur de fichier 64 bits, Ce code fonctionnera comme prévu comme prévu lors de la compilation avec MSVC ++ et générera un fichier de 40 Go (non signé de longs 32 bits) sur votre disque dur. xxx

alors comment T'aider? Eh bien, MS fournit sa propre API non standard qui permet 64 bits Fsek () et FTell ()

https://msdn.microsoft.com/en-us/library/75YW9BF3.aspx

aussi, vous pouvez réellement déplacer le pointeur de fichier avec Fsek régulier () en le faisant par incréments ... essentiellement si vous allez: xxx

Il déplacera efficacement le pointeur de fichier sur la marque de 10 Go. < p> avec ftell () cependant, vous êtes probablement baisé sans utiliser l'API MS pour cela.

TL; DR-FOPEN (), FREAD () et FORITE () fonctionnent sur MSVC avec de la grande Fichiers> 2 Go, mais FTell () et Fsek () Ne font pas parce que l'API n'était pas conçue correctement.


0 commentaires

0
votes

Vous n'êtes pas complètement sans options sous Windows:

  • _fseeki64
  • _ftelli64
  • ...

    in Linux, vous pouvez utiliser -d_file_offset_bits = 64 (A #define _file_offset_bits 64 pourrait travail, pas sûr) et fseeko / ftello . De nombreux systèmes ont également fseeeko64 et ftello64 ​​), qui fonctionnent indépendamment de ce #define .


0 commentaires