使用fread从文件中读取的奇怪文本

时间:2014-01-12 19:48:42

标签: c arrays fopen fwrite fread

我从写入的文件读取时出现问题,它显示奇怪的令牌而不是我试图打印的文本。它可能只是一个简单的解决方案,但我找不到它。现在坐了几个小时! :/

http://imgur.com/syiJCPS

#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);
    }

}

1 个答案:

答案 0 :(得分:1)

当您第一次阅读该文件时,您会读取int的记录数。

fread(&antalvinnareinlasning, sizeof(int), 1, file);

但是当你编写文件时,你要做的第一件事就是写一个未初始化的struct vinnare

fwrite(&vinnare[0], sizeof(struct vinnare),1, file);

因此,您的文件格式不对齐,并且您最终会在int字段中找到来自char的二进制数据。

此外,如果您的结构中有填充,我建议您freadfwrite完全相同。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条记录来存储0,但是您使用了错误的记录。您需要在N-1的{​​{1}}循环中将1引导至N而非forinlasningTillFil。最后一次读取将位于&vinnare[N]位置,该位置无效。