黑马程序员技术交流社区
标题: 遇到一个空文件判断的问题,附上链表写的通讯录 [打印本页]
作者: 果壳里的果冻 时间: 2015-6-22 15:58
标题: 遇到一个空文件判断的问题,附上链表写的通讯录
在写通讯录时,如果打开一个空文件,这句话为什么还是要执行一次循环体,求教。while (!feof(fp)) {
。。。
}
作者: 果壳里的果冻 时间: 2015-6-22 16:02
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NAMELEN 21
#define TELELEN 21
//定义联系人结构体
typedef struct contact{
char name[NAMELEN]; //姓名
char tele[TELELEN]; //电话号码
struct contact *next;//指向下一个联系人
}Contact,*P_List,*Pcontact;
int main(int argc, const char * argv[]) {
//函数声明
void readfile(P_List head);
void showACont(P_List head);
void addCont(P_List head);
void deletCont(P_List head);
void modiCont(P_List head);
void seekCont(P_List head);
int exitSys();
//表头
P_List head = (P_List)malloc(sizeof(Contact));
head->next = NULL;
//读取数据文件的内容
readfile(head);
int funNum;//功能序号
//整体while循环
while(1){
//输出界面,提示用户输入相应功能编号
printf("******************************\n");
printf("******* 欢迎使用通讯录 *******\n");
printf("******* 1.添加联系人 *******\n");
printf("******* 2.删除联系人 *******\n");
printf("******* 3.修改联系人 *******\n");
printf("******* 4.查看所有联系人 *******\n");
printf("******* 5.搜索联系人 *******\n");
printf("******* 6.退出系统 *******\n");
printf("******************************\n");
//判断序号是否在范围内
printf("请输入功能序号:");
scanf("%d",&funNum);
while(funNum < 1 || funNum > 6){
printf("功能序号非法,请重新输入:");
scanf("%d",&funNum);
}
//switch来调用相应功能
switch (funNum) {
case 1:
addCont(head);
break;
case 2:
deletCont(head);
break;
case 3:
modiCont(head);
break;
case 4:
showACont(head);
break;
case 5:
seekCont(head);
break;
case 6:
if (exitSys()==0)
return 0;
break;
default:
break;
}
}
return 0;
}
作者: 果壳里的果冻 时间: 2015-6-22 16:04
/**
* 打开文件,读取内容
*
* @param head 链表头指针
*/
void readfile(P_List head){
FILE *fp;//文件指针
P_List last=head;
//尝试打开文件,读取内容
fp = fopen("contactsIfo.data", "rb");
if (fp == NULL) {
printf("未找到文件。\n");
fp = NULL;
fp = fopen("contactsIfo.data", "wb");
if (fp != NULL) {
printf("新数据文件新建成功!\n");
}else{
printf("新数据文件新建失败!\n");
}
fclose(fp);
}else{
//读取文件内容
printf("读取文件内容.\n");
//first->next=NULL;
fp = fopen("contactsIfo.data", "rb");
while (!feof(fp)) { //此处为什么会多执行一次
Pcontact p ;
p= (Pcontact)malloc(sizeof(Contact));
fread(p, sizeof(Contact), 1, fp);
if (strcmp(p->tele, p->name)!=0) {
last->next=p;
p->next=NULL;
last = last->next;
}
}
}
fclose(fp);
}
/**
* 添加新的联系人
*
* @param head 链表头指针
*/
void addCont(P_List head){
P_List h=head;
Pcontact newContact=(Pcontact)malloc(sizeof(Contact));
printf("添加联系人.\n");
//用户输入新联系人姓名号码
printf("请输入新联系人姓名:");
scanf("%s",newContact->name);
printf("请输入新联系人号码:");
scanf("%s",newContact->tele);
//保存到链表中
//循环到最后一个
while (h->next) {
h=h->next;
}
h->next=newContact;
newContact->next=NULL;
//写入文件中
FILE *fp;
fp = fopen("contactsIfo.data", "ab");
if (fp != NULL) {
fwrite(newContact, sizeof(Contact), 1, fp);
printf("add name=%s,tele=%s",newContact->name,newContact->tele);
printf("写入成功!\n");
}else{
printf("新联系人写入文件失败\n");
}
//关闭文件
fclose(fp);
}
作者: 果壳里的果冻 时间: 2015-6-22 16:06
本帖最后由 果壳里的果冻 于 2015-6-22 16:08 编辑
/**
* 删除联系人
*
* @param head 链表头指针
*/
void deletCont(P_List head){
P_List h=head,l=head;
char name[NAMELEN];
printf("请输入删除联系人姓名:");
scanf("%s",name);
//进行匹配
if (h->next!=NULL) {
h=h->next;
while (h) {
if (strcmp(h->name, name)==0) {
//删除节点
l->next=h->next;
printf("联系人删除成功!\n");
//重新写入文件
h=head;
FILE *fp;
fp = fopen("contactsIfo.data", "wb");
if (h->next!=NULL) {
h=h->next;
while (h) {
if (fp != NULL) {
fwrite(h, sizeof(Contact), 1, fp);
printf("readd name=%s,tele=%s",h->name,h->tele);
printf("写入成功!\n");
h=h->next;
}else
printf("新联系人写入文件失败\n");
}
}
//关闭文件
fclose(fp);
break;
}
h=h->next;l=l->next;
}
}else{
printf("没有该联系人!\n");
}
}
/**
* 修改联系人
*
* @param head 链表头指针
*/
void modiCont(P_List head){
int i=0;//统计修改处的位置
P_List h=head;
char name[NAMELEN];
printf("请输入修改联系人姓名:");
scanf("%s",name);
//进行匹配
if (h->next!=NULL) {
h=h->next;
while (h) {
if (strcmp(h->name, name)==0) {
//输出原联系人姓名及号码
printf("原姓名:%s,原号码:%s\n",h->name,h->tele);
//Pcontact p = (Pcontact)malloc(sizeof(Contact));
printf("请输入新姓名:");
scanf("%s",h->name);
printf("请输入新号码:");
scanf("%s",h->tele);
//重新写入文件
h=head;
FILE *fp;
fp = fopen("contactsIfo.data", "wb");
if (h->next!=NULL) {
h=h->next;
while (h) {
if (fp != NULL) {
fwrite(h, sizeof(Contact), 1, fp);
printf("readd name=%s,tele=%s",h->name,h->tele);
printf("写入成功!\n");
h=h->next;
}else
printf("新联系人写入文件失败\n");
}
}
//关闭文件
fclose(fp);
break;
}
h=h->next;i++;
}
}else printf("没有该联系人!\n");
}
作者: 果壳里的果冻 时间: 2015-6-22 16:08
/**
* 打印所有联系人
*
* @param head 链表头指针
*/
void showACont(P_List head){
P_List h=head;
if (h->next!=NULL) {
h=h->next;
printf("姓名 号码\n");
while (h) {
printf("%-10s%-10s\n",h->name,h->tele);
h=h->next;
}
}
else
printf("联系人为空!\n");
}
/**
* 查找联系人
*
* @param head 链表头指针
*/
void seekCont(P_List head){
P_List h=head;
char name[NAMELEN];
printf("请输入修改联系人姓名:");
scanf("%s",name);
//进行匹配
if (h->next!=NULL) {
h=h->next;
while (h) {
if (strcmp(h->name, name)==0) {
//输出原联系人姓名及号码
printf("所查找人->姓名:%s,号码:%s\n",h->name,h->tele);
break;
}
h=h->next;
}
}else printf("没有该联系人!\n");
}
/**
* 退出程序
*
* @return 返回0则表示退出程序
*/
int exitSys(){
return 0;
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |