Comment puis-je connaître la taille d'un fichier que j'ai ouvert avec une application écrite en C ? Je voudrais connaître la taille, car je veux mettre le contenu du fichier chargé dans une chaîne de caractères, que j'alloue à l'aide de malloc()
. Il suffit d'écrire malloc(10000*sizeof(char));
est, à mon avis, une mauvaise idée.
@camh - Merci mec. Ce commentaire a permis de résoudre un problème que j'avais avec un algorithme de dimensionnement de fichier. Pour mémoire, on ouvre un fichier en mode binaire en mettant un 'b' à la fin de la chaîne mode de fopen.
42 votes
Notez que sizeof(char) est égal à 1, par définition.
11 votes
Oui, mais le compilateur d'une plate-forme ésotérique peut définir char comme 2 octets - le programme alloue alors plus que nécessaire. On ne peut jamais être trop sûr.
36 votes
@George un "compilateur de plateforme ésotérique" où sizeof(char) != 1 n'est pas un vrai compilateur C. Même si un caractère est de 32 bits, il retournera toujours 1.
25 votes
@George : Le standard C (et C++) garantit que
sizeof(char)==1
. Voir par exemple parashift.com/c++-faq-lite/intrinsic-types.html#faq-26.151 votes
En fait, je préfère
malloc(x*sizeof(char));
amalloc(x);
lors de l'allocation de x caractères. Oui, ils compilent toujours la même chose, mais j'aime la cohérence avec les autres allocations de mémoire.1 votes
J'espère que l'optimiseur peut comprendre cela et faire ce qu'il faut, donc utiliser sizeof est plus sûr et équivalent.
6 votes
@Ben : écrire plus que ce dont vous avez besoin n'est pas plus sûr, cela peut être plus dangereux. Plus de code présente une plus grande surface d'infection pour les bogues. Si vous realmente vous voulez plus de sécurité, alors utilisez
p = malloc(N * sizeof (*p))
- ne codez pas en dur le type là où le compilateur ne peut pas le vérifier pour vous.1 votes
Vous pouvez utiliser
fstat
confileno
si vous avezFILE*
:fstat(fileno(f), &stat)
0 votes
Il est bon de rappeler que la norme C redéfinit le mot octet pour signifier un caractère Il est donc préférable d'éviter de parler d'octets dans un contexte C. (Essayez plutôt les octets. AFAIK la norme n'a pas changé ceux-là).