Y a-t-il des pièges pour des systèmes d'exploitation spécifiques, que je devrais connaître?
Il existe de nombreux doublons ( 1 , 2 , 3 , 4 , 5 ) de cette question, mais ils ont reçu une réponse il y a des décennies. Les réponses très votées à nombre de ces questions sont erronées aujourd'hui.
Méthodes d'autres (anciens QA) sur .sx
stat.h (wrapper sprintstatf ), utilise syscall
tellg () , renvoie par définition une position mais pas nécessairement des octets . Le type de retour ne l'est pas
int
.
c++
c++17
filesize
c++-standard-library
Jonas Stein
la source
la source
tellg
problèmes similaires . Le seul qui vaille la peine de s'embêter est le quatrième, et ce n'est pas génial, car il en parle tropofstream
, à la fois dans la question et dans ses réponses. Celui-ci est bien meilleur pour exprimer l'intention que les autres (sauf pour le premier, qui est étrangement fermé).stat(2)
toute façon? Est-il devenu trop vieux ou quoi?stat(2)
Cela ne fait pas partie de la norme du langage.Réponses:
<filesystem>
(ajouté dans C ++ 17) rend cela très simple .Comme indiqué dans les commentaires, si vous prévoyez d'utiliser cette fonction pour décider du nombre d'octets à lire dans le fichier, gardez à l'esprit que ...
la source
std::uintmax_t
pourra porter de plus grandes valeurs questd::size_t
? Si non, pourquoi ne pas utiliserstd::size_t
, qui est sans doute plus reconnaissable? +1 sur la réponse, btwfile_size
retour. Cela me semble un peu bizarre aussi.std::size_t
ne doit contenir que la taille maximale des objets en mémoire. Les fichiers peuvent être considérablement plus volumineux,size_t
32 bits modernes), c'est 32 bits etuintmax_t
64 bits.C ++ 17 apporte
std::filesystem
ce qui rationalise de nombreuses tâches sur les fichiers et les répertoires. Non seulement vous pouvez obtenir rapidement la taille du fichier et ses attributs, mais également créer de nouveaux répertoires, parcourir des fichiers, travailler avec des objets de chemin.La nouvelle bibliothèque nous offre deux fonctions que nous pouvons utiliser:
La première fonction est une fonction libre dans
std::filesystem
, la seconde est une méthode dansdirectory_entry
.Chaque méthode a également une surcharge, car elle peut lever une exception ou renvoyer un code d'erreur (via un paramètre de sortie). Voici le code détaillé expliquant tous les cas possibles.
la source