在C

时间:2017-08-03 18:47:57

标签: c struct

我很困惑如何用文件和结构写/读数据。我在互联网上搜索但仍感到困惑。

当我想保存结构时,它将保存为中文。当我想从文件中读取时,它会读取其他内容。

你可以帮帮我吗?

这是我的结构

struct yogurt
{
    char name[50];
    char topping[50];
    int size;
    int harga;
}*record;

这是处理文件写入/读取的代码的一部分

void menu1(void)
{
    FILE *in;
    in = fopen("data.txt","a");
    int nm,tp,sz;
    record = (struct yogurt *)malloc(sizeof(struct yogurt));
    bool loop;
    char sure[10];
    while (loop = true)
    {
        printf("Input your yogurt [chocolate/vanilla/strawberry] : ");
        scanf("%s",record->name);
        if (strcmp(record->name,"chocolate") == 0)
        {
            nm = 9;
            break;
        }
        else if (strcmp(record->name,"vanilla") == 0)
        {
            nm = 7;
            break;
        }
        else if (strcmp(record->name,"strawberry") == 0)
        {
            nm = 10;
            break;
        }
    }
    while (loop = true)
    {
        printf("Input your topping [kitkat/jelly/kiwi/mango] : ");
        scanf("%s",record->topping);
        if (strcmp(record->topping,"kitkat") == 0)
        {
            tp = 6;
            break;
        }
        else if (strcmp(record->topping,"jelly") == 0)
        {
            tp = 5;
            break;
        }
        else if (strcmp(record->topping,"kiwi") == 0)
        {
            tp = 4;
            break;
        }
        else if (strcmp(record->topping,"mango") == 0)
        {
            tp = 5;
            break;
        }
    }
        printf("Input your size [100..500] : ");
        scanf("%d",&record->size);
        sz = record->size;
        record->harga = nm * tp * sz * 10;
        printf("\n\nDetail Purchase:\n");
        printf("Name : %s\n", record->name);
        printf("Topping : %s\n", record->topping);
        printf("Size : %d\n", record->size);
        printf("Price : %d\n", record->harga);
        while (loop = true)
        {
        printf("Are you sure [y/n] : ");
        scanf("%s", sure);
        if (strcmp(sure, "y") == 0)
        {
        fwrite(record,sizeof(struct yogurt),1,in);
        fclose(in);
        free(record);
        printf("Data succesfully added....");
        count++;
        _getch();
        system("cls");
        main();
        }
        else if (strcmp(sure, "n") == 0)
        {
            system("cls");
            main();
        }
        }

}

void menu2(void)
{
    FILE *in;
    in = fopen("data.txt", "r");
    record = (struct yogurt*)malloc(sizeof(struct yogurt));
    int i = 1;
    while(i<=count)
    {
        fread(record,sizeof(struct yogurt),i,in);
        printf("Name : %s\n", record->name);
        printf("Topping : %s\n", record->topping);
        printf("Size : %d\n", record->size);
        printf("Price : %d\n", record->harga);
        i++;
    }
    fclose(in);
    free(record);
    _getch();
    system("cls");
    main();
}

2 个答案:

答案 0 :(得分:1)

确保以二进制模式打开文件。

使用文本模式可能会损坏int size, int harga成员的二进制数据。

如果在各种*ninx类编译器中,这不会改善,因为文本模式和二进制文件没有这种区别。

// in = fopen("data.txt","a");
in = fopen("data.txt","ab");

// in = fopen("data.txt", "r");
in = fopen("data.txt", "rb");

以下代码是一项任务。通常这里的代码需要比较。由于loop以后不会被阅读,因此不清楚OP的意图。

// while (loop = true)
while (loop == true)
// or even better
while (loop)

在使用fread(record, sizeof(struct yogurt), i, in);成员之前,应检查record的返回值。

else if (strcmp(sure, "n") == 0)缺少先前if()

count未声明。

该文件不是真正的文本文件,因此建议不要使用.txt后缀。

可能存在其他问题。

最好发布真实的可编辑代码。

答案 1 :(得分:0)

如果要将其保存在文本文件中,则需要将其序列化(转换为文本格式):

而不是fwrite(record,sizeof(struct yogurt),1,in);fclose(in);

你需要这样的东西(创建逗号分隔文件)

fprintf(in, "%s,%s,%d,%d\n",record -> name, record -> topping, record -> size, record -> targa);
fclose(in);

以二进制格式保存(并读取当然),将字母'b'添加到模式字符串更安全。因为我们不知道什么平台 - 有些人可以区别对待文本和二进制文件。任何符合POSIX标准的系统都不需要它,并且将被忽略 - 因此它没有害处。请改用"ab""rb"模式字符串。