C: l'Écriture et la Lecture d'une chaîne à partir d'un fichier binaire
Je veux stocker des chaînes de caractères dans un fichier binaire, avec beaucoup d'autres données, de messagerie instantanée à l'aide du code ci-dessous (lorsque je l'utilise pour de vrai les chaînes seront malloc avais) je peux écrire dans le fichier. Ive a regardé dans un éditeur hexadécimal. Je ne suis pas sûr im écrit le terminateur null correctement (ou si j'en ai besoin). quand je l'ai lu en retour je reçois la même longueur de la chaîne que j'ai stocké, mais pas la chaîne. ce que je fais mal?
FILE *fp = fopen("mybinfile.ttt", "wb");
char drumCString[6] = "HelloFILE *fp = fopen("mybinfile.ttt", "wb");
char drumCString[6] = "Hello\0";
printf("%s\n", drumCString);
//the string length + 1 for the null terminator
unsigned short sizeOfString = strlen(drumCString) + 1;
fwrite(&sizeOfString, sizeof(unsigned short), 1, fp);
//write the string
fwrite(drumCString, sizeof(char), sizeOfString, fp);
fclose(fp);
fp = fopen("mybinfile.ttt", "rb");
unsigned short stringLength = 0;
fread(&stringLength, sizeof(unsigned short), 1, fp);
char *drumReadString = malloc(sizeof(char) * stringLength);
int count = fread(&drumReadString, sizeof(char), stringLength, fp);
//CRASH POINT
printf("%s\n", drumReadString);
fclose(fp);
";
printf("%s\n", drumCString);
//the string length + 1 for the null terminator
unsigned short sizeOfString = strlen(drumCString) + 1;
fwrite(&sizeOfString, sizeof(unsigned short), 1, fp);
//write the string
fwrite(drumCString, sizeof(char), sizeOfString, fp);
fclose(fp);
fp = fopen("mybinfile.ttt", "rb");
unsigned short stringLength = 0;
fread(&stringLength, sizeof(unsigned short), 1, fp);
char *drumReadString = malloc(sizeof(char) * stringLength);
int count = fread(&drumReadString, sizeof(char), stringLength, fp);
//CRASH POINT
printf("%s\n", drumReadString);
fclose(fp);
Vous devez vous connecter pour publier un commentaire.
Que vous faites mal lors de la lecture.
vous avez mis le & pour le pointeur de variable, c'est pourquoi il donne erreur de segmentation.
J'ai enlevé que cela fonctionne très bien et il retourne Bonjour correctement.
Je vois un couple de questions, dont certaines problématiques, certains stylistique.
malloc
,fread
etfwrite
puisqu'il est possible que la répartition peut échouer, et aucune donnée ne peut être lu ou écrit.sizeof(char)
est toujours 1, il n'y a pas besoin de multiplier par elle."Hello\0"
est en fait 7 octets de long. Vous n'avez pas besoin d'ajouter de superflu, terminateur null.char x[] = "xxx";
plutôt que de spécifier une longueur définie (sauf si vous voulez un tableau plus longue que la chaîne de cours).fread(&drumReadString ...
, que vous êtes en train d'écraser la pointeur, pas la mémoire qu'il points de. C'est la cause de votre panne. Il devrait êtrefread(drumReadString ...
.Un couple de conseils:
1
Une terminaison de
\0
est implicite dans tout le guillemet double chaîne, et en ajoutant à la fin vous vous retrouvez avec deux. Les deux initialisations sont identiques:Donc
est assez, et en spécifiant la taille de la matrice est facultative lorsqu'il est initialisé comme ça, le compilateur va déterminer la taille nécessaire (6 octets).
2
Lors de l'écriture d'une chaîne de caractères, vous pourriez tout aussi bien, il suffit d'écrire tous les caractères en une seule fois (au lieu d'écrire un par un caractère sizeOfString fois):
3
Même si pas si courant normal d'un pc de bureau scénario, malloc peut retourner la valeur NULL et vous permettra de bénéficier de l'élaboration d'un habbit de toujours vérifier le résultat, car dans les environnements embarqués, obtenir la valeur NULL n'est pas une improbable issue.
Vous n'avez pas écrit la résiliation NUL, vous n'avez pas besoin d', mais alors vous devez penser à l'ajouter lors de la lecture. ie malloc stringLength + 1 char, lire stringLength caractères et ajouter un
\0
à la fin de ce qui a été lu.Maintenant l'habitude d'avertissement: si vous écrivez un fichier binaire de la façon dont vous faites ici, vous avez beaucoup d'implicite des hypothèses qui rendent votre format difficile de port, parfois même à une autre version de la même compilateur -- j'ai vu alignement par défaut dans la structure des modifications entre les versions du compilateur.
Un peu plus à ajouter à paxdiablo et AProgrammer - si vous allez utiliser malloc dans l'avenir, il suffit de faire de l'aller. C'est une meilleure forme et signifie que vous n'aurez pas de débogage lors de la commutation.
En outre, je ne suis pas entièrement de voir l'utilisation de la unsigned short, si vous prévoyez sur l'écriture d'un fichier binaire, il considère que le unsigned char type est généralement de la taille de l'octet, il est très pratique pour cela.
Vous venez de supprimer votre &drumReadString dans la fonction fread.Il vous suffit d'utiliser drumReadString en fonction de ganesh mentionné.Parce que,drumReadString est un tableau.La matrice est semblable à des pointeurs qui pointent vers l'emplacement de la mémoire directement.