我很困惑如何用文件和结构写/读数据。我在互联网上搜索但仍感到困惑。
当我想保存结构时,它将保存为中文。当我想从文件中读取时,它会读取其他内容。
你可以帮帮我吗?这是我的结构
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();
}
答案 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"
模式字符串。