C语言写入文件

luxiliang 2012-03-22 02:13:56
比如:如果向一个文件中写入一个人的信息,包括ID,Name,年龄等三个。
如果要实现当用户输入一个人的信息时,此ID已经存在,则提示“此人信息已存在”。
另外,输入ID后怎么实现查询功能。希望能够有个简单的代码。十分感谢!

我觉得:当用户输入一个信息时,不管是添加还是查询,必须要把原来的所有信息ID和当前输入的信息ID对比,相同则输出这一组的信息,不相同则提示“无此人信息”。就是不知道怎么用代码表示出来。求解!!!
...全文
1479 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
NeDong 2012-03-22
  • 打赏
  • 举报
回复
用循环单链表保存数据。
输入数据时,把文件中的数据读入链表中,输入的数与链表对比,
查找的时候,把文件数据读入链表,遍历查找就OK了

可以先写一个从文件中读取信息到链表的函数
自信男孩 2012-03-22
  • 打赏
  • 举报
回复
先把文件中的数据读到内存中,然后每次输入都进行遍历和比较。
DNcx831 2012-03-22
  • 打赏
  • 举报
回复
上学期,写过类似的通讯录程序。
下面是一些主要程序的源代码,可能会给你点参考
********************************************

2.1 通讯录文件操作的实现技术
(主要函数及其使用方法)
一.文件的打开:
a.
fp=fopen("d:\\text.txt","wb")
以二进制写入的方式打开D盘跟目录下的text.txt文件
b.
fp=fopen("d:\\text.txt","ab")
以二进制添加的方式打开D盘跟目录下的text.txt文件
c.
fp=fopen("d:\\text.txt","rb")
以二进制读取的方式打开D盘跟目录下的text.txt文件
二.文件的读取:
fread(cardd,sizeof(struct card),100,fp)
把100个名片的内容从文本文件中读取出来,并赋值给cardd的结构数组中
三.文件的写入:
a.
fwrite(&cardd[NUM],sizeof(struct card),1,fp)
把cardd[NUM]中的名片信息写入到fp指针所指向的文件中
b.
fwrite(cardd,sizeof(struct card),100,fp)
把carrd中100个名片信息一起写入到fp指针所指向的文件中

2.2 通讯录内存的表示结构
(结构体、单向链表、指针等)
名片结构体:
struct card
{
char name[11];
char age[4];
char tel[20];
char addr[40];
char email[30];
char val; //名片是否有效,有效为1,无效为0;
int cod_num; //姓的汉字编码号,用于排序
//struct card *next; //指向下一个名片
}cardd[100];
2.3 人机交互的设计技术
(菜单选择、格式化输入输出主要函数等)
主菜单:
void disp_menu()
{
system("cls");
uchar i;
for(i=0;i<20;i++)
printf("*");
printf("\n");
printf("简易手机通讯录v1.0\n");
printf("1-->新建\n");
printf("2-->查询\n");
printf("3-->修改\n");
printf("4-->删除\n");
printf("5-->显示\n");
printf("6-->退出\n");
for(i=0;i<20;i++)
printf("*");
printf("\n");
}
名片格式化输出:
printf("姓名:\t%s\n年龄:\t%s\n电话:\t%s\n地址:\t%s\n邮箱:\t%s\n",cardd[i].name,cardd[i].age,cardd[i].tel,cardd[i].addr,cardd[i].email);
2.4 基于c语言的汉字编码获取
/*************得到姓的汉字编码,用于排序***********/
int coding(char n)
{
int i,j;
unsigned int m=0;
char s[3]={'\0'},ss;
char ch[17]={'\0'};
s[0]=cardd[n].name[0];
s[1]=cardd[n].name[1];
for(j=0;j<2;j++)
{
ss=s[j];
for(i=(j+1)*8-1;i>=j*8;i--)
{
ch[i]=(ss&0x01)+'0';
ss=(ss>>1);
}
}
for(i=15;i>=0;i--)
m+=(ch[i]-'0')*(int)(pow(2,(15-i)));

/*printf("%s\n",cardd[n].name);
printf("%s\n",s);
printf("%s\n",ch);
printf("%d\n",m);*/
return m;
}
汉字有16位,用s[3]的前二位存储,最后一位存储‘\0’;
按位依次读取汉字的位,并存在ch[17]中;
则ch[17]的是二进制的汉字编码,通过
for(i=15;i>=0;i--)
m+=(ch[i]-'0')*(int)(pow(2,(15-i)));
将二进制的汉字编码转化为十进制的并存到m中;
nanjingnew4 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 luxiliang 的回复:]
你说的我都晓得。。。关键是代码搞不定啊。。

引用 8 楼 nanjingnew4 的回复:

文件格式可以写成这样
ID|名字|年龄
ID|名字|年龄
ID|名字|年龄
类推。。。竖线作为分隔符,方便判断
打开文件用fopen,写文件可以用fprintf,读文件用fgets,关闭文件用fclose.
试着写个吧,思路方法都给你了
[/Quote]
你觉得哪个地方有问题
luxiliang 2012-03-22
  • 打赏
  • 举报
回复
你说的我都晓得。。。关键是代码搞不定啊。。[Quote=引用 8 楼 nanjingnew4 的回复:]

文件格式可以写成这样
ID|名字|年龄
ID|名字|年龄
ID|名字|年龄
类推。。。竖线作为分隔符,方便判断
打开文件用fopen,写文件可以用fprintf,读文件用fgets,关闭文件用fclose.
试着写个吧,思路方法都给你了
[/Quote]
nanjingnew4 2012-03-22
  • 打赏
  • 举报
回复
文件格式可以写成这样
ID|名字|年龄
ID|名字|年龄
ID|名字|年龄
类推。。。竖线作为分隔符,方便判断
打开文件用fopen,写文件可以用fprintf,读文件用fgets,关闭文件用fclose.
试着写个吧,思路方法都给你了
一古清流 2012-03-22
  • 打赏
  • 举报
回复
文件是怎么保存数据的?
如果每条个人信息都是单独的行的话,可以用getline函数
然后再用字符串比较函数查看该行是否已经存在输入的ID
当然每输入一个新的ID都要从文件头到文件尾循环一次
luxiliang 2012-03-22
  • 打赏
  • 举报
回复
不是作业题,因为我不会用数据库。。。[Quote=引用 4 楼 luciferisnotsatan 的回复:]

引用 1 楼 czh3642210 的回复:

我觉得还是用数据库的好。。。

这是很标准的作业题。
[/Quote]
luxiliang 2012-03-22
  • 打赏
  • 举报
回复
额。。求解
luciferisnotsatan 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 czh3642210 的回复:]

我觉得还是用数据库的好。。。
[/Quote]
这是很标准的作业题。
qixing1115 2012-03-22
  • 打赏
  • 举报
回复
文件操作的东西多看看吧,不难
luxiliang 2012-03-22
  • 打赏
  • 举报
回复
数据库是好啊,不过是想用文件操作实现。呵呵[Quote=引用 1 楼 czh3642210 的回复:]

我觉得还是用数据库的好。。。
[/Quote]
面包大师 2012-03-22
  • 打赏
  • 举报
回复
我觉得还是用数据库的好。。。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧