Salut,
Je voudrais créer un fichier d'un certaine taille :
#define FILE_SIZE 25320
Cette valeur est en octet (1 octet équivaut à 8 bits, jusqu'ici tout va bien)
Voici la fonction en question :
int create(char *name){
int i;
FILE *new = NULL ;
int p = 0;
/*choix du nom du fichier*/ [...]
/*gestion d'erreur d'ouverture */ [...]
/* problème ici : */
for(i=0;i<FILE_SIZE / sizeof(int);i++){
fwrite(&p, sizeof(int), 1, new);
}
fs = new ; /* fs est global, donc reconnu */
return 0;
}
Le code compile et s'execute corretement, seulement à la place d'avoir un fichier de 25320 octets, je me retrouve avec un fichier de 24 576 octets ...
-rw-r--r-- 1 wlan0 wlan0 24576 20 juil. 17:07 fichier
$wc -c block.mfs
24576 block.mfs
Mon sizeof(int) vaut 4.
Pourquoi ça veut pas ?
fwrite peut ne pas tout ecrire d'un coup. Lis man fwrite et regarde la valeure de retour.
Le 20 juillet 2016 à 17:52:46 godrik a écrit :
fwrite peut ne pas tout ecrire d'un coup. Lis man fwrite et regarde la valeure de retour.
Salut Godrik,
pour tester ça j'ai ajouté un
int count = 0;
en début de fonction, puis j'ai modifié la ligne du fwrite en :
count += fwrite(&p, sizeof(int), 1, new);
À la fin ma variable count vaut 6330 ( vu que j'écris par paquet de sizeof(int)) ça donne bien 6330 * 4 = 25320 octets d'écrits.
(Le fichier fait toujours 24576 octets)
Mon test me semble bon
Sans avoir access a un complet complet qui pose probleme c'est difficile a dire.
Le fichier n'est pas ferme et on dirait que tu passe le descripteur de fichier vers l'exterieur de la fonction. Donc peut etre qu'il se passe quelquechose ailleurs?
Euh oui effectivement, en testant avec un code "propre" :
#include <stdio.h>
#include <stdlib.h>
#define FILE_SIZE 25320
int main(){
int i;
int count = 0;
FILE *new = NULL ;
int p = 0;
char *name = "unfichier" ;
new = fopen( name , "w+");
if(!new){
fprintf(stderr, "Erreur lors de la creation du nouveau volume");
return 1;
}
for(i=0;i<FILE_SIZE / sizeof(int);i++){
count += fwrite(&p, sizeof(int), 1, new);
}
printf("Count : %d", count);
return 0;
}
Le fichier fait la bonne taille à la fin .. du coup y'a une merde quelque part d'autre
merci
Le fichier n'est pas ferme
C'était ça en le fermant ça fonctionne, et comme j'ai encore besoin du fichier par la suite j'ai mis un fflush() pour "terminer" les écritures
Tu utilise quel os?
Archlinux
Et tu utilise glibc ou une autre libc ?
parceque la glibc devrait flusher automatiquement quand le programme termine [1]
[1] https://www.gnu.org/software/libc/manual/html_node/Flushing-Buffers.html
Et tu utilise glibc ou une autre libc ?
parceque la glibc devrait flusher automatiquement quand le programme termine [1]
Sûrement glibc.
Pour plus de précisions (que j'aurai dû donner plus tôt) mon programme contient un invite de commande donc quand j'exécutais la commande qui me permettait d'écrire dans le fichier (via la fonction) le programme me redonnait la main et ne terminait jamais => donc pas de vidage de buffer
Par contre j'avais remarqué que quand j'appelais la fonction suivi d'un "return 0" (ce qui dans mon cas termine le programme) le fichier créé faisait la taille désirée => buffer vidé
Ceci explique cela