结构体定义
struct fruitstorage
{
char* name;//水果名字
int quantity[10];//进货日期,数量
//int day, quantity;//进货日期,数量
int num, dayquantity;//链表编号,日期个数
float price;//价格
struct fruitstorage* pre, * next;
};
函数:
fruitstorage head[21]={};
/head = (fruitstorage)malloc(sizeof(fruitstorage) * 21);/
FILE f;
f = fopen("水果库存.txt", "r+");
int t, s, m;
for (m = 1; m <= 21; m++)
{
head[m].dayquantity = 0;
head[m].num = m;
fscanf(f, "%s", head[m].name);
fscanf(f, "%f", head[m].price);
fscanf(f, "%d", &t);
while (t != -1)
{
s = t;
fscanf(f, "%d", &t);
head[m].quantity[s] = t;
head[m].dayquantity++;
fscanf(f, "%d", &t);
}
head[m].quantity[s + 1] = -1;
}
fclose(f);
能通过结构体数组读写文件
(1)fruitstorage head[21]这个数组一共21个元素,下标从0到20,但是你的for (m = 1; m <= 21; m++) 中,下标是从1到21,数组越界了,应该是:
for (m = 0; m < 21; m++)
(2)fscanf(f, "%f", head[m].price);这里,head[m].price前需要加&符号
fscanf(f, "%f", &head[m].price);
(3)head[m].quantity[s] = t; 和head[m].quantity[s + 1] = -1;这两句,最好先判断一下s和s+1是否在[010)之间,否则可能出现数组越界的情况
(4)结构体中的name是指针,使用前需要先分配空间,或者直接使用字符数组。
代码修改如下,修改部分有注释:
struct fruitstorage
{
char name[20];//水果名字 ------------修改,这里直接用字符数组,不要用指针
int quantity[10];//进货日期,数量
//int day, quantity;//进货日期,数量
int num, dayquantity;//链表编号,日期个数
float price;//价格
struct fruitstorage* pre, * next;
};
//函数:
fruitstorage head[21] = {};
// head = (fruitstorage)malloc(sizeof(fruitstorage) * 21); /
FILE* f;
f = fopen("水果库存.txt", "r+");
int t, s, m;
for (m = 0; m < 21; m++) //-------------- 修改 这里从0到20
{
head[m].dayquantity = 0;
head[m].num = m;
fscanf(f, "%s", head[m].name);
fscanf(f, "%f", &head[m].price); //-----------修改,这里需要加&符号
fscanf(f, "%d", &t);
while (t != -1)
{
s = t;
fscanf(f, "%d", &t);
//----------------- 修改,这里最好先判断一下s是否超出
if(s>=0 && s<10)
head[m].quantity[s] = t;
head[m].dayquantity++;
fscanf(f, "%d", &t);
}
// -------- 修改,这里最好先判断一下s是否超出
if(s+1>=0 && s+1<10)
head[m].quantity[s + 1] = -1;
}
fclose(f);