C语言从文件中读取一个结构体数组和把修改后的结构体数组存入到一个文件中
本人基础知识不在解释,帖子是我自己编的一个例子,很好理解,尤其是对初学C语言的童鞋,希望大家可以从中了解到用C语言从文件中读取一个结构体数组和把修改后的结构体数组存入到一个文件中
本例以一个书籍信息的结构体数组为例,包括其书籍编号 书籍名称 作者 类别brand 出版时间(年) 库存量 价格
代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct /*书籍信息 包含书籍编号 书籍名称 作者 类别brand 出版时间(年) 库存量 价格*/
{
int ID;
char name[100];
char author[100];
char brand[100];
int time;
int num;
int price;
}BOOK;
BOOK array[30];
int main()
{
FILE *fp = fopen("book.txt", "r");
int i=0;
if(fp == NULL)
{
printf("can't read data from the book.txt!\n");
exit(0);
}
//打开文件
while(fscanf(fp,"%d%s%s%s%d%d%d",&array[i].ID,array[i].name,array[i].author,array[i].brand,
&array[i].time,&array[i].num,&array[i].price)!=EOF)
{
i++;
}
fclose(fp);
//***这串代码是从文件book中读取一个结构体数组,注意这个i很重要,表示文件中一共有几个数组,下面要用到***
for( int ii = 0; ii < i; ii++)
{
if(array[ii].ID != 0)
printf("ID:%-10d name:%-18s author:%-10s brand:%-8s time:%-5d number:%-5d price:%d\n", array[ii].ID,
array[ii].name, array[ii].author, array[ii].brand, array[ii].time, array[ii].num, array[ii].price);
}
//***把数组读取出来***
int a;
printf("请输入你要删除书籍的ID:\n");
scanf("%d", &a);
for(int ii = 0; ii < i; ii++)
{
if(array[ii].ID == a)
{
array[ii].ID = 0;
break;
}
}
//把要删除的书籍ID变成0,下面把结构体数组读取到文件中时如果数组ID为0,则不读取到到文件中,这样这本书籍就删除了
fp = fopen("book.txt", "w");
if(fp == NULL)
{
printf("can't read data from the book.txt!\n");
exit(0);
}
//打开文件, 但和上面打开文件不太一样,“w”打开时会把文件中内容全部清空,而上面的“r”不会
for(int iii=0; iii < i ; iii++)
//iii<i表示只有i-1本书籍信息被存入文件
{
if(array[iii].ID != 0) //当书籍ID不为0时把书籍的信息读到文件中
{
fprintf(fp," %d %s %s %s %d %d %d\n",array[iii].ID,
array[iii].name, array[iii].author, array[iii].brand, array[iii].time, array[iii].num, array[iii].price);
}
}
getchar();
fclose(fp);
}
运行这串代码之前,你需要在你的编程软件创建的文件里里面创建一个文本文档
代码中就是从这个book文件里面读取数据
而book里面你可以输入和上面图片相似的内容。分别代表书籍编号 书籍名称 作者 类别brand 出版时间(年) 库存量 价格
然后运行代码,最好一行表示一本书籍信息
然后输入你要删除书籍的ID,点击回车
你再次运行代码
你会发现你先前输入ID的书籍没了
**
注意:
一定要重视 i 的作用,即从文件中读取到多少个结构体数组,不管是删除一个结构体数组,还是之后添加,修改什么的到存入文件中的时候都要用到
本帖主要是说怎么从文件中读取一个结构体数组和把修改后的结构体数组存入到一个文件中,从例中明白此处才是关键
为方便大家理解使用下面在说一个
修改结构体数组中书籍的信息再导入文件
运行代码前先创建一个book文件
内容格式还是和之前一样
代码如下
#include <stdio.h>
#include <stdlib.h>
typedef struct /*书籍信息 包含书籍编号 书籍名称 作者 类别brand 出版时间(年) 库存量 价格*/
{
int ID;
char name[100];
char author[100];
char brand[100];
int time;
int num;
int price;
}BOOK;
BOOK array[30];
int main()
{
FILE *fp = fopen("book.txt", "r");
int i=0;
if(fp == NULL)
{
printf("can't read data from the book.txt!\n");
exit(0);
}
while(fscanf(fp,"%d%s%s%s%d%d%d",&array[i].ID,array[i].name,array[i].author,array[i].brand,
&array[i].time,&array[i].num,&array[i].price)!=EOF)
{
i++;
}
fclose(fp);
for( int ii = 0; ii < i; ii++)
{
if(array[ii].ID != 0)
printf("ID:%-10d name:%-18s author:%-10s brand:%-8s time:%-5d number:%-5d price:%d\n", array[ii].ID,
array[ii].name, array[ii].author, array[ii].brand, array[ii].time, array[ii].num, array[ii].price);
}
int a;
printf("请输入要修改书籍的ID:\n");
scanf("%d", &a);
for(int ii = 0; ii < i; ii++)
{
if(array[ii].ID == a)
{
printf("书籍名称:");
scanf("%s", &array[ii].name);
printf("作者:");
scanf("%s", &array[ii].author);
printf("出版社:");
scanf("%s", &array[ii].brand);
printf("出版时间:");
scanf("%d", &array[ii].time);
printf("数量:\n");
scanf("%d", &array[ii].num);
printf("价格:");
scanf("%d", &array[ii].price);
}
}
fp = fopen("book.txt", "w");
if(fp == NULL)
{
printf("can't read data from the book.txt!\n");
exit(0);
}
for(int iii=0; iii < i; iii++)
{
if(array[iii].ID != 0)
{
fprintf(fp," %d %s %s %s %d %d %d\n",array[iii].ID,
array[iii].name, array[iii].author, array[iii].brand, array[iii].time, array[iii].num, array[iii].price);
}
}
getchar();
fclose(fp);
}
运行
输入提示内容
修改后再次打开
发现上面的操作有作用