CONNEXION
  • RetourJeux
    • Tests
    • Soluces
    • Previews
    • Sorties
    • Hit Parade
    • Les + attendus
    • Tous les Jeux
  • RetourActu
    • Culture Geek
    • Astuces
    • Réalité Virtuelle
    • Rétrogaming
    • Toutes les actus
  • RetourHigh-Tech
    • Actus JVTECH
    • Bons plans
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTECH
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch
    • Xbox Series
    • Overwatch 2
    • FUT 23
    • League of Legends
    • Genshin Impact
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • PS4
  • One
  • Switch
  • Wii U
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Etoile Abonnement RSS

Sujet : [C] Problème pour créer un fichier d'une certaine taille

DébutPage précedente
1
Page suivantePage suivante
RoadAndCo RoadAndCo
MP
Niveau 8
20 juillet 2016 à 17:24:58

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 ? :hap:

godrik godrik
MP
Niveau 22
20 juillet 2016 à 17:52:46

fwrite peut ne pas tout ecrire d'un coup. Lis man fwrite et regarde la valeure de retour.

RoadAndCo RoadAndCo
MP
Niveau 8
20 juillet 2016 à 18:01:42

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 :(

godrik godrik
MP
Niveau 22
20 juillet 2016 à 18:06:48

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?

RoadAndCo RoadAndCo
MP
Niveau 8
20 juillet 2016 à 18:13:40

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 :oui:

merci :hap:

RoadAndCo RoadAndCo
MP
Niveau 8
20 juillet 2016 à 18:41:51

Le fichier n'est pas ferme

C'était ça :oui: 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

:cimer:

godrik godrik
MP
Niveau 22
20 juillet 2016 à 19:04:48

Tu utilise quel os?

RoadAndCo RoadAndCo
MP
Niveau 8
20 juillet 2016 à 19:42:19

Archlinux

godrik godrik
MP
Niveau 22
20 juillet 2016 à 20:59:12

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

RoadAndCo RoadAndCo
MP
Niveau 8
21 juillet 2016 à 00:22:21

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 :oui:

DébutPage précedente
1
Page suivantePage suivante
Répondre
Prévisu
?
Victime de harcèlement en ligne : comment réagir ?
Infos 0 connecté(s)

Gestion du forum

Modérateurs : godrik, LGV
Contacter les modérateurs - Règles du forum

Sujets à ne pas manquer

La vidéo du moment