[英]Strange text reading from file using fread
我在读取写入文件时遇到问题,它显示奇怪的标记,而不是我尝试打印的文本。 这可能只是一个简单的解决方案,但我找不到。 现在已经坐在这里几个小时了! :/
#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);
}
}
首次读取文件时,您读取的是记录数的int
。
fread(&antalvinnareinlasning, sizeof(int), 1, file);
但是,当您写文件时,要做的第一件事就是写一个未初始化的struct vinnare
:
fwrite(&vinnare[0], sizeof(struct vinnare),1, file);
因此,您的文件格式不会对齐,并且最终会在char
字段中包含来自int
二进制数据。
另外,我建议您将fread
与fwrite
完全相同,以防结构中存在填充。 不保证sizeof(struct vinnare)
与sizeof(int) + sizeof(char[20])
完全相同,因此:
fread(&vinnare[a].ar, sizeof(int), 1, file);
fread(&vinnare[a].namn, sizeof(char)*20, 1, file);
不一定和
fread( &( vinnare[a]), sizeof(struct vinnare), 1, file) ;
最后,您在内存中分配了N
条记录来存储struct
,但是使用了错误的记录。 您需要在inlasningTillFil
的for
循环中索引0
到N-1
而不是1
到N
最后一次读取将在&vinnare[N]
位置上无效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.