文件读写C

文件读写C,c,struct,fopen,scanf,fwrite,C,Struct,Fopen,Scanf,Fwrite,我读写文件有问题。我使用fwrite并编写了大量的结构数组。之后,如果没有文件,我会写入文件 如果文件的第一个字节上有定义在文件中的获奖者数量,但我无法在文件中获得正确的数字,除非我手动打开文件并写入示例3,否则它将显示,否则不会显示 你能找到我的问题吗 然后写vinnare[]。name为空,不适用于NULL:/ struct vinnare{ int ar; char namn[20]; }; main(){ int a, val, antalvinnare

我读写文件有问题。我使用fwrite并编写了大量的结构数组。之后,如果没有文件,我会写入文件

如果文件的第一个字节上有定义在文件中的获奖者数量,但我无法在文件中获得正确的数字,除非我手动打开文件并写入示例3,否则它将显示,否则不会显示

你能找到我的问题吗

然后写vinnare[]。name为空,不适用于NULL:/

struct vinnare{
    int ar;
    char namn[20];
};

    main(){
    int a, val, antalvinnareinlasning,test=0;

    struct vinnare *vinnare;

    FILE *file;
    file = fopen("F:\\Uppgifter.txt", "rt")
    if (file == NULL){
        printf("Hej2");
        vinnare = NULL;
        printf("Ange antal vinnare:");
        scanf("%d", &antalvinnareinlasning);
        vinnare = (struct vinnare *)malloc(antalvinnareinlasning*sizeof(struct vinnare));
        vinnare = inlasningTillFil(vinnare, antalvinnareinlasning);
    }
    else{
            **fscanf(file, "%b", &test);
            printf("%d",test);**

        fflush(stdin);
        getchar();

    }
}


struct vinnare *inlasningTillFil(struct vinnare *vinnare, int antalvinnareinlasning){
    int a, temp;

    FILE *file;
    file = fopen("F:\\Uppgifter.txt", "wt");
    **vinnare[0].ar = antalvinnareinlasning;**
    **strcpy(vinnare[0].namn, "");**                         //What should it say to make it empty?
    **fwrite(&vinnare[0], sizeof(struct vinnare),1, file);**


    for (a = 1; a < (antalvinnareinlasning + 1); a++){
        printf("year: ");
        scanf("%d", &temp);
        vinnare[a].ar = temp;
        fflush(stdin);

        printf("Winner that year:");
        fgets(vinnare[a].namn, 40, stdin);
        fflush(stdin);

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

}
struct-vinnare{
INTAR;
char-namn[20];
};
main(){
int a,val,antalvinnaresning,test=0;
结构vinnare*vinnare;
文件*文件;
file=fopen(“F:\\Uppgifter.txt”、“rt”)
if(file==NULL){
printf(“Hej2”);
vinnare=NULL;
printf(“Ange antal vinnare:”);
scanf(“%d”和antalvinnaresining);
vinnare=(结构vinnare*)malloc(antalvinnarelansining*sizeof(结构vinnare));
vinnare=inlasningTillFil(vinnare,antalvinnareinlasning);
}
否则{
**fscanf(文件“%b”,测试(&T);
printf(“%d”,测试)**
fflush(stdin);
getchar();
}
}
结构vinnare*inlasningTillFil(结构vinnare*vinnare,int ANTALVINNAREINASning){
INTA,温度;
文件*文件;
file=fopen(“F:\\Uppgifter.txt”、“wt”);
**维纳尔[0].ar=Antalvinareinlasning**
**strcpy(vinnare[0].namn,“”);***//它应该说什么才能使其为空?
**fwrite(&vinnare[0],sizeof(struct vinnare),1,file)**
对于(a=1;a<(Antalvinareinlasning+1);a++){
printf(“年份:”);
scanf(“%d”、&temp);
维纳尔[a].ar=温度;
fflush(stdin);
printf(“当年获奖者:”);
fgets(vinnare[a].namn,40,stdin);
fflush(stdin);
fwrite(&vinnare[a],sizeof(struct vinnare),1,file);
}
}

fscanf
解析字符串(通常使用
fprintf
编写)
fread
读取二进制数据(通常使用
fwrite
编写)。您正在配对
fscanf
fwrite


%b
也不是
fscanf
的标准格式说明符,但既然我建议在这种情况下完全远离
fscanf
,我就不深入探讨了。

因此,如果int是4字节而不是“fscanf(file,“%b,&test)”,那么它应该是fread(&vinnare[a].ar,4,1,file);?:)是的。当然,这里有很多假设——int是四个字节(使用sizeof(int));机器写入和机器读取的int大小相同;这些机器的耐久性是一样的。这就是序列化为字符串(fprintf/fscanf)而不是二进制(fwrite/fread)的优点;它速度较慢,占用更多空间,但所做的假设较少。