繁体   English   中英

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

[英]Strange text reading from file using 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);
    }

}

首次读取文件时,您读取的是记录数的int

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

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

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

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

另外,我建议您将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 ,但是使用了错误的记录。 您需要在inlasningTillFilfor循环中索引0N-1而不是1N 最后一次读取将在&vinnare[N]位置上无效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM