微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用动态分配的数组时将数据保存到二进制文件中

如何解决使用动态分配的数组时将数据保存到二进制文件中

我有要保存到文件中的数据。第二次运行程序后(在写入我想要的数据后),保存的数据被读取为随机值(任意数字)。我不确定这是否是因为我正在使用动态分配的数组。如果有人能告诉我为什么不保存和打印正确的数据?

这是代码示例:

Bundle.init(identifier:)

解决方法

我的建议是重写您的代码以使其更清晰。这个想法是让函数具有非常具体的任务,这样代码就不会到处混合。波纹管是一个工作示例:

#include <stdio.h>
#include <stdlib.h>

#define WIDTH 4
#define HEIGHT 4

typedef struct
{
    int data;
}LandData;

int fileExists(char *filename)
{
    FILE *file = fopen(filename,"rb");
    if (file == NULL)
        return 0;
    fclose(file);
    return 1;
}

void fillArray(LandData *array)
{
    printf("Give me the data\n");
    for (int column = 0; column < WIDTH; column++)
    {
        for (int row = 0; row  < HEIGHT; row++)
        {
            printf("[%d,%d]: ",column,row);
            scanf("%d",&(array[row + column * HEIGHT].data));
        }
    }
}

void serializeArray(LandData *array,char *filename)
{
    FILE *file;
    file = fopen(filename,"wb");
    if (file == NULL)
    {
        printf("Error while opening file!\n");
        exit(1);
    }
    
    fwrite(array,sizeof(LandData),WIDTH * HEIGHT,file);
    
    fclose(file);
}

void printSerializedArray(char *filename)
{
    LandData array[WIDTH * HEIGHT];
    
    FILE *file = fopen(filename,"rb");
    if (file == NULL)
    {
        printf("Error while opening file!\n");
        exit(1);
    }
    
    fread(array,file);
    
    for (int column = 0; column < WIDTH; column++)
    {
        for (int row = 0; row  < HEIGHT; row++)
        {
            printf("%d ",array[row + column * HEIGHT].data);
        }
        printf("\n");
    }
    
    fclose(file);
}

int main(int argc,char *argv[])
{
    if (fileExists("file.bin"))
    {
        printSerializedArray("file.bin");
    }else
    {
        LandData array[WIDTH * HEIGHT];
        fillArray(array);
        serializeArray(array,"file.bin");
    }
    return 0;
}

我没有使用动态分配的数组(因为它不是必需的),但是如果您想使用动态数组,那么只需将 LandData array[WIDTH * HEIGHT]; 替换为 LandData *array = malloc(sizeof(LandData) * WIDTH * HEIGHT);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。