Fichier binaire en lecture/écriture en C
J'ai donc une entrée.fichier bin qui contient les éléments suivants
IK-SZH;jdl72u;John Doe;2013-03-28 11:05
IK-GRR;kat91n;Jane Doe;2013-03-21 15:41
IK-GRR;oat62f;Jane Doe;2013-03-24 08:08
Ce que je suis en train de faire est de lire dans un struct. Faire quelque chose avec les données. Ajouter/Supprimer des lignes.
Alors, j'aimerais écrire le contenu de la structure de dos à l'entrée.fichier bin dans le même format que ci-dessus.
Mais au lieu d'apparaître comme il est ci-dessus. C'est comme ça (sans les espaces):
IK-SZH NUL jdl72u NUL John Doe NUL NUL NUL NUL NUL 2013-03-28 NUL NUL NUL IK-GRR NUL kat91n NUL Jane Doe NUL NUL NUL NUL ...
Quand je re-lire le fichier (avec les NULs), Elle ne met que la 1ère ligne dans la struct
Mon code
typedef struct foo {
char kid[7];
char jid[7];
char name[21];
char time[20];
} Foo;
Foo foo[200];
FILE* fp;
int size;
------- Lecteur de fichier
void read(char* filename){
fp = fopen(filename, "rb");
int i = 0;
while (!feof(fp)) {
if (fp==NULL){perror("File opening error\n"); exit(1);}
fscanf(fp,"%[^;]; %[^;]; %20[^\;]; %s\n", foo[i].kid, foo[i].jid,
foo[i].name, foo[i].time);
i++;
}
size = i;
print();
fclose(fp);
}
void print(){
int i;
for (i = 0; i < size; ++i){
printf("%s\t %s\t %s\t %s\n", foo[i].kid, foo[i].jid,
foo[i].name, foo[i].time);
}
}
----- Écrivain
void write(){
char str[1000];
FILE* f = fopen("input.bin", "wb");
fseek(f, 0, SEEK_SET);
int i;
for (i = 0; i < jel_size; i++)
fwrite(&foo[i], sizeof(struct foo), 1, f);
fclose(f);
}
Essayé cela, mais cela n'a rien écrire dans le fichier:
char str[1000];
sprintf(str,"%s;%s;%s;%s\n", jelent[i].kazon,
jelent[i].jazon,jelent[i].nev, jelent[i].ido );
write(f,&str,sizeof(str))!=sizeof(str);
L'entrée.bin me semble un fichier texte au lieu d'un fichier binaire.
Vous pouvez envisager d'utiliser fprintf() au lieu de fwrite() ou write().
Vous devriez ouvrir un fichier texte en mode texte, pas en mode binaire.
Vous pouvez envisager d'utiliser fprintf() au lieu de fwrite() ou write().
Vous devriez ouvrir un fichier texte en mode texte, pas en mode binaire.
OriginalL'auteur VZKiss | 2013-04-01
Vous devez vous connecter pour publier un commentaire.
Votre définition de la structure est:
Le code qui écrit les structures pour le fichier est dans
write()
:Si la structure est initialisée avec tous les octets à zéro, alors pour la première ligne de données que vous mentionnez:
on peut en déduire que la structure contient:
qui a plus ou moins d'accord avec ce que vous dites, le fichier contient:
Selon mes estimations, il manque un peu NULs, d'après le nom, et le temps et un NUL après la date.
Si vous voulez que le texte de sortie, vous devez formater les données dans
write()
à l'aide defprintf()
analogue à lafscanf()
déclaration que vous avez dans leread()
fonction. Vous devriez probablement de retour d'un statut de la fonction pour indiquer si elle a été couronnée de succès. Vous pouvez argumenter pour la vérification de lafclose()
a réussi, trop.Si vous voulez binaire de sortie, vous devez utiliser l'entrée binaire dans
read()
. Encore une fois, vous devriez envisager un retour à une indication de succès ou d'échec; pour éviter les variables globales est bon, aussi.Soit technique de travail; essayez d'utiliser l'un sur la production et l'autre sur l'entrée va la mener au chaos et à la confusion.
Notez que les fonctions
read()
etwrite()
sont utilisés par POSIX avec une interface différente. Alors que vous vous en tenez à la Norme C, les noms sont justes pour vous à utiliser, mais vous seriez probablement mieux avec d'autres noms, tels quereader()
etwriter()
oufoo_read()
etfoo_write()
.OriginalL'auteur Jonathan Leffler
https://gist.github.com/anonymous/5288805
Code modifié un peu, commenté, et également testé, de sorte qu'il fonctionne pour vous.
OriginalL'auteur Sava Vranešević