将两个以上“struct”写入文件时出现问题,然后读取该文件

时间:2014-01-14 06:25:34

标签: c file fwrite fread

我在为文件写入多个结构时遇到了一些麻烦,然后关闭了程序。下次打开文件并在那里打印时,它会显示奇怪的文字。

如果我只选择打印1个结构加上强制性的首先说明文件中有多少个结构(文件中的第一个)它显示正确。但是只要有两个以上http://imgur.com/ANTCSAZ

我一直在寻找几个小时的解决方案,但无法找到它,会感谢我能得到的所有帮助! :)

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

}

3 个答案:

答案 0 :(得分:1)

对于第一个struct数据块,您写道:

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

即。 sizeof(struct vinnare)个字节的数据

但您只阅读int

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

即。 4个字节的数据

因此file指针仅前进4个字节并指向20个字节的垃圾数据,然后是函数{{1}中使用for编写的下一个数据块}。

答案 1 :(得分:1)

下面:

vinnare = inlasningTillFil(vinnare, antalvinnareinlasning);

您正在分配不返回任何内容的函数的值

答案 2 :(得分:0)

我严重怀疑这个循环。您从1开始,意味着第二项,以number_of_allocations + 1结尾,显然超出了您的分配范围。

for (a = 1; a < (antalvinnareinlasning + 1); a++){