我在将多个结构写入文件然后关闭程序时遇到一些麻烦。下次我打开文件并打印其中的内容时,它会显示奇怪的文本。
如果我只选择打印 1 个结构加上强制性的第一个,说明文件中有多少个结构(文件中的第一个),它显示正确。但是一旦有两个以上的 https://i.stack.imgur.com/ApXhu.jpg。
我一直在寻找几个小时的解决方案,但找不到它,将不胜感激我能得到的所有帮助! :)
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
//#include "allafunktioner.h"
struct vinnare{
int ar;
char namn[20];
};
struct vinnare *inlasningTillFil(struct vinnare *vinnare, int antalvinnareinlasning);
int meny();
int vinnarear(int ar, char namnlista, int vinnare);
void artistnamn(int ar, char namnlista, int vinnare);
void skrivutalla(int ar, int namnlista, int vinnare);
main(){
int a=1, val, antalvinnareinlasning,test=0;
struct vinnare *vinnare;
FILE *file;
file = fopen("F:\Uppgifter", "rb");
if (file == NULL){
vinnare = NULL;
printf("Ange antal vinnare:");
scanf("%d", &antalvinnareinlasning);
vinnare = (struct vinnare *)malloc(antalvinnareinlasning*sizeof(struct vinnare));
vinnare = inlasningTillFil(vinnare, antalvinnareinlasning);
}
else{
fread(&antalvinnareinlasning, sizeof(int), 1, file);
printf("%d", antalvinnareinlasning);
vinnare =(struct vinnare *)malloc(antalvinnareinlasning*sizeof(struct vinnare));
for (a = 1; a < (antalvinnareinlasning + 1); a++){
fread(&vinnare[a].ar, sizeof(int), 1, file);
fread(&vinnare[a].namn, sizeof(char)*20, 1, file);
printf("%d", vinnare[a].ar);
printf("%s", vinnare[a].namn);
}
}
fflush(stdin);
getchar();
}
struct vinnare *inlasningTillFil(struct vinnare *vinnare, int antalvinnareinlasning){
int a, temp;
FILE *file;
file = fopen("F:\Uppgifter", "wb");
vinnare[0].ar = antalvinnareinlasning;
fwrite(&vinnare[0], sizeof(struct vinnare),1, file);
for (a = 1; a < (antalvinnareinlasning + 1); a++){
printf("Ange vilket år du vill mata in: ");
scanf("%d", &temp);
vinnare[a].ar = temp;
fflush(stdin);
printf("Ange vinnaren för det året:");
fgets(vinnare[a].namn, 20, stdin);
fflush(stdin);
fwrite(&vinnare[a], sizeof(struct vinnare), 1, file);
}
}
对于struct
数据的第一个块,你写道:
fwrite(&vinnare[0], sizeof(struct vinnare),1, file);
即 sizeof(struct vinnare)
字节的数据
但你读的只是int
fread(&antalvinnareinlasning, sizeof(int), 1, file);
即 4 字节的数据
因此,file
指针仅前进 4 个字节,并指向 20 个字节的垃圾数据,然后是您在函数 inlasningTillFil
中使用 for
编写的下一个数据块。
在这里:
vinnare = inlasningTillFil(vinnare, antalvinnareinlasning);
您正在分配一个不返回任何内容的函数的值
我严重怀疑循环。您从 1
开始,表示第二项并以 number_of_allocations + 1
结尾,显然超出了您的分配范围。
for (a = 1; a < (antalvinnareinlasning + 1); a++){