关于fread,fwrite问题求助,谢谢!

YIHUALC 2012-11-24 09:27:24
大家好,我最近初使用标准IO,遇到下面问题:我写了个电话号码的添加函数add_phone(),删除函数delete_phone()
问题:当我执行添加后,再执行删除,当全部都删除时,再添加,打印出来没问题;
但当我将添加和删除函数交替执行时(没有删除完时,再执行添加(add_phone())),就会出现问题了:
1.当删除函数(delete_phone)里read用:
while(!feof(fp1))
{
nread = fread(phone_delete1,sizeof(phone_delete1),1,fp1);
}
打印时可以打印出之前没有删除完的数据。而新添加的数据刚没有。
2.当删除函数(delete_phone)里read用:
while(1)
{
nread = fread(phone_delete1,sizeof(phone_delete1),1,fp1);
if(feof(fp1) == 0)
break;
}
打印时可以打印出之后添加(add_phone())的数据 ,而,之前没有删除完的,却不能打印。
但我是要全部都能显示出来啊。

这问题困扰我两天了,还不能解决。请各位大虾帮助看下,非常感谢。

我把代码附上来了,坐等大家帮忙! (为节省大家时间,中间段可不看,只帮忙看看那几个IO函数就行)


void add_phone(int *count1)//2.1添加电话号码
{
struct phonenumber phone_add[4];
struct phonenumber phone_add1[4];
int i,digit,protocol_choice,ret,j=4;
char cont;
int add_count = 0;


for(i=*count1+add_count;i<j;i++)
{
phone_add[i].order=i+1;
retype:
printf("请输入第%d个号码:",phone_add[i].order);
scanf("%s",phone_add[i].number);
if(strlen(phone_add[i].number) > 11)
{
printf("您输入号码长度超限\n");
goto retype;
}
else
{
for(digit=0;digit<12;digit++)
{
if(phone_add[i].number[digit] == 'c')
{
printf("请重新输入\n");
goto retype;
}
}

pro:
protocol();
scanf("%d",&protocol_choice);
fflush(stdin);
switch(protocol_choice)
{
case 1:
printf("**********\n");
printf("*正在保存*\n\n");
sleep(1);
printf("您输入的%d电话号码是:%s\n",phone_add[i].order,phone_add[i].number);
break;
case 2:
printf("**********\n");
printf("*正在保存*\n\n");
sleep(1);
printf("您输入的%d电话号码是:%s\n",phone_add[i].order,phone_add[i].number);
break;
case 3:
printf("**********\n");
printf("*正在保存*\n\n");
sleep(1);
printf("您输入的%d电话号码是:%s\n",phone_add[i].order,phone_add[i].number);
break;
case 4:
printf("**********\n");
printf("*正在保存*\n\n");
sleep(1);
printf("您输入的%d电话号码:%s\n",phone_add[i].order,phone_add[i].number);
break;
default:
goto pro;
break;
}//end switch
}//end else
input_con:
printf("是否继续(Y/N)\n");
scanf("%c",&cont);
cont = getchar();
if((cont == 'N') || (cont == 'n'))
{
(add_count)++;
break;
}
else if((cont == 'Y') ||(cont == 'y'))
{
(add_count)++;
printf("count1 = %d\n",add_count);
}
else
{
printf("input wrong\n");
goto input_con;
}
}//end for


for(i=*count1;i<*count1+add_count;i++)
{
FILE *phone_fp1 = fopen("./wenjian/phone.txt","a+");
if(!phone_fp1)
{
perror("faild open");
exit(-1);
}
printf("open sucess\n");
printf("order:%d nmuber:%s\n",phone_add[i].order,phone_add[i].number);
fwrite(phone_add,sizeof(phone_add),1,phone_fp1);
printf("write sucess\n");
fclose(phone_fp1);
}




for(i=*count1;i<*count1+add_count;i++)
{

printf("您输入的%d电话是:%s\n",phone_add[i].order,phone_add[i].number);
}
*count1+=add_count;

}



void delete_phone(int *count2)//2.2删除电话号码
{
struct phonenumber phone_delete1[4];
struct phonenumber phone_delete2[4];
int i,delete;
int j=0;
FILE *fp1,*fp2;

if ((fp1= fopen("./wenjian/phone.txt","r")) == NULL)
{
perror("open failed\n");
exit(-1);
}
printf("open sucess\n");
int nread;
while(!feof(fp1))
{
nread = fread(phone_delete1,sizeof(phone_delete1),1,fp1);

}
/*
while(1)
{
nread = fread(phone_delete1,sizeof(phone_delete1),1,fp1);
if (feof(fp1) == 0)
break;
}
*/
fclose(fp1);

printf("read sucess\n");
printf("coun2 = %d\n",*count2);
for(i=0;i<*count2;i++)
{
phone_delete1[i].order = i+1;
printf("您输入的%d电话号码是:%s\n",phone_delete1[i].order,phone_delete1[i].number);
}
input:
printf("请输入要删除编号:\n");
scanf("%d",&delete);
while((delete<=*count2))
{
strcpy(phone_delete1[delete-1].number,phone_delete1[delete].number);
delete++;
}
(*count2)--;
fp2 = fopen("./wenjian/phone.txt","w");
if (!fp2)
exit(-1);
for(i=0;i<*count2;i++)
{
fwrite(phone_delete1,sizeof(phone_delete1),1,fp2);
}
printf("delete write sucess\n");
fclose(fp2);


printf("剩下号码是:\n");
for(i=0;i<*count2;i++)
{
printf("编号:%d 号码:%s\n",phone_delete1[i].order,phone_delete1[i].number);
}
}
...全文
295 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
ice50303 2012-11-26
  • 打赏
  • 举报
回复
小伙子 你的fwrite 写错了~
海洋_YY 2012-11-25
  • 打赏
  • 举报
回复
文件用fopen打开后,指针一般指向文件头!
漫步者、 2012-11-24
  • 打赏
  • 举报
回复
引用 11 楼 YIHUALC 的回复:
引用 10 楼 ganpengjin1 的回复:你的void delete_phone(int *count2)//2.2删除电话号码 中,你把这句改一下看看: C/C++ code?123fp2 = fopen("./wenjian/phone.txt","w");改为:fp2 = fopen("./wenjian/phone.txt","a+"); fp2这……
fclose(fp1);你这里关闭了 .... fopen(fp2=...("a+")) 重新加载: strcpy(phone_delete1[delete-1].number,phone_delete1[delete].number) ,然后把记录数-1, 利用循环吧,如果整块的话,所有所有数据都要写入,会有重复的! fwrite(phone_delete1,sizeof(phone_delete1p[i]),1,fp2);
YIHUALC 2012-11-24
  • 打赏
  • 举报
回复
引用 10 楼 ganpengjin1 的回复:
你的void delete_phone(int *count2)//2.2删除电话号码 中,你把这句改一下看看: C/C++ code?123fp2 = fopen("./wenjian/phone.txt","w");改为:fp2 = fopen("./wenjian/phone.txt","a+");
fp2这个“W”是要在最后重新与入的,而之前fp1是以“r”打开的啊,里面有很多数据还在。 而且我有作这一步:strcpy(phone_delete1[delete-1].number,phone_delete1[delete].number) 换为“a+”了,那之前的就没重复啦
漫步者、 2012-11-24
  • 打赏
  • 举报
回复
你的void delete_phone(int *count2)//2.2删除电话号码 中,你把这句改一下看看:
fp2 = fopen("./wenjian/phone.txt","w");
改为:
fp2 = fopen("./wenjian/phone.txt","a+");
漫步者、 2012-11-24
  • 打赏
  • 举报
回复
就只能打印出后来添加进去的? 那么你把文件指针置前看看!放首部
YIHUALC 2012-11-24
  • 打赏
  • 举报
回复
引用 6 楼 ganpengjin1 的回复:
C/C++ code?1234567while(1){ nread = fread(phone_delete1,sizeof(phone_delete1),1,fp1); if(feof(fp1) == 0) break;} 用EOF判断,不要用0
您是什么意思? 我用过 while(!feof(fp1)) { nread = fread(phone_delete1,sizeof(phone_delete1),1,fp1); } 这样的话就只能打印出后来添加进去的,前面没删除完的就没了。这个结束符我不知道怎么用?
YIHUALC 2012-11-24
  • 打赏
  • 举报
回复
引用 5 楼 ganpengjin1 的回复:
打印时可以打印出之前没有删除完的数据。而新添加的数据刚没有。 == 你保存了吗?
有保存啊,我delete_phone()函数里面最后有重新写入啊。
漫步者、 2012-11-24
  • 打赏
  • 举报
回复
while(1)
{
      nread = fread(phone_delete1,sizeof(phone_delete1),1,fp1);
      if(feof(fp1) == 0)
          break;
}      
用EOF判断,不要用0
漫步者、 2012-11-24
  • 打赏
  • 举报
回复
打印时可以打印出之前没有删除完的数据。而新添加的数据刚没有。 == 你保存了吗?
YIHUALC 2012-11-24
  • 打赏
  • 举报
回复
我现在想的是,到底是不是read那里设置出了问题?
YIHUALC 2012-11-24
  • 打赏
  • 举报
回复
引用 1 楼 enlinux 的回复:
至少有以下问题 C/C++ code?123456789101112131415for(i=*count1;i<*count1+add_count;i++){FILE *phone_fp1 = fopen("./wenjian/phone.txt","a+");if(!phone_fp1){perror("faild open");exit(-1);}printf(……
您的意思是就只打开一次嘛对吧,我试过,还是解决不了问题。不知道怎么弄
子善旬 2012-11-24
  • 打赏
  • 举报
回复
至少有以下问题

for(i=*count1;i<*count1+add_count;i++)
{
FILE *phone_fp1 = fopen("./wenjian/phone.txt","a+");
if(!phone_fp1)
{
perror("faild open");
exit(-1);
}
printf("open sucess\n");
printf("order:%d   nmuber:%s\n",phone_add[i].order,phone_add[i].number);
fwrite(phone_add,sizeof(phone_add),1,phone_fp1);
printf("write sucess\n");
fclose(phone_fp1);
}
改为 FILE *phone_fp1 = fopen("./wenjian/phone.txt","a+"); if(!phone_fp1) { perror("faild open"); exit(-1); } printf("open sucess\n"); for(i=*count1;i<*count1+add_count;i++) { printf("order:%d nmuber:%s\n",phone_add[i].order,phone_add[i].number); fwrite(phone_add,sizeof(phone_add),1,phone_fp1); } printf("write sucess\n"); fclose(phone_fp1); [/code]
YIHUALC 2012-11-24
  • 打赏
  • 举报
回复
引用 22 楼 yhy15292083137 的回复:
fread 和 fwrite 是以文件流的形式写入和读取的,在写入和读取的时候都可以指定文件的特定位置,而且写入和读取都是以一定格式读取和写入的,比如你这里是一个结构体的方式; 文件的格式有好多种,每个文件都有个文件头信息,之后是紧紧跟着数据的,你看你写入的数据,首先考虑有没有将数据写到文件头的位置了,这种情况一般在copy文件时,出现情况比较多;然后再看写入的数据……
谢谢,出问题的位置大概找到了,就楼上那一段,关键是从文件末尾添加时出现了问题啊, 原来文件里有结构体数据,后面再添加同类型的数据,不知道是没设好还是怎么样, 照理说用:FILE *phone_fp1 = fopen("./wenjian/phone.txt","a+");打开后直接写就可以了啊? 不知道怎么不行
海洋_YY 2012-11-24
  • 打赏
  • 举报
回复
fread 和 fwrite 是以文件流的形式写入和读取的,在写入和读取的时候都可以指定文件的特定位置,而且写入和读取都是以一定格式读取和写入的,比如你这里是一个结构体的方式; 文件的格式有好多种,每个文件都有个文件头信息,之后是紧紧跟着数据的,你看你写入的数据,首先考虑有没有将数据写到文件头的位置了,这种情况一般在copy文件时,出现情况比较多;然后再看写入的数据有没有覆盖之前写入的数据的位置,文件指针有没有后移,或者移动的大小有问题。 然后文件只要在开头以可读可写的模式打开一次就可以了! 这是我的经验! 要我看代码!头有点痛!!嘿嘿!希望对你有用!
YIHUALC 2012-11-24
  • 打赏
  • 举报
回复
我刚详细看了下,确定是在 for(i=*count1;i<*count1+add_count;i++) { FILE *phone_fp1 = fopen("./wenjian/phone.txt","a+"); if(!phone_fp1) { perror("faild open"); exit(-1); } printf("open sucess\n"); printf("order:%d nmuber:%s\n",phone_add[i].order,phone_add[i].number); fwrite(phone_add,sizeof(phone_add),1,phone_fp1); printf("write sucess\n"); fclose(phone_fp1); } 这出的问题,我在这函数前打开文件,并读出来,可以打印出原来的没删除完的数据,而执行fwrite函数后就只能打印出后来添加的数据了?不知道为什么。难道用“a+”时有什么要求吗,还是保存结构体时有附加信息?
漫步者、 2012-11-24
  • 打赏
  • 举报
回复
把你的程序给我,邮件发我250862771@qq.com
YIHUALC 2012-11-24
  • 打赏
  • 举报
回复
引用 18 楼 ganpengjin1 的回复:
C/C++ code?123456789101112131415for(i=*count1;i<*count1+add_count;i++){FILE *phone_fp1 = fopen("./wenjian/phone.txt","a+");if(!phone_fp1){perror("faild open");exit(-1);}printf("open suces……
谢谢,我刚看了下,phone_fp1打开成功了的,打印了open sucess。 我重复写入的是add_count次的,从*count1到(*count1+add_count),因为我要保留记录,所以选择这个笨方法 phone_add,与sizeof(phone_add)不应该这么写吗?那要怎么写啊 而我添加(写入)的数据可以打印,就原来存在的还是不能显示出来。 我刚在add_phone()最后重新打开了一次文件,打印出来还是只能显示后来添加的?
漫步者、 2012-11-24
  • 打赏
  • 举报
回复
for(i=*count1;i<*count1+add_count;i++)
{
FILE *phone_fp1 = fopen("./wenjian/phone.txt","a+");
if(!phone_fp1)
{
perror("faild open");
exit(-1);
}
printf("open sucess\n");
printf("order:%d   nmuber:%s\n",phone_add[i].order,phone_add[i].number);
fwrite(phone_add,sizeof(phone_add),1,phone_fp1);//你这个文件打开成功了没?
你再看一下,你怎么要重复写入*count1+add_count次?phone_add,sizeof(phone_add),这样写,不觉有问题吗?
printf("write sucess\n");
fclose(phone_fp1);
}
YIHUALC 2012-11-24
  • 打赏
  • 举报
回复
引用 16 楼 ganpengjin1 的回复:
引用 15 楼 YIHUALC 的回复:引用 14 楼 ganpengjin1 的回复:引用 13 楼 YIHUALC 的回复:引用 12 楼 ganpengjin1 的回复:引用 11 楼 YIHUALC 的回复:引用 10 楼 ganpengjin1 的回复:你的void delete_phone(int *count2)//2.2删除电话号码 中,你把这句改一下看……
您的意思是用指针,删除某一项是吧? 1.phone_delete()函数里面我先在fp1用“r”里把文件里全部读到结构体数组对吧, 2.然后再在结构体数组里面将要删除的项删掉, 3.然后让数组项减1,再用fp2把该数组用"w"全部写入原来文件。原文件就更新了。 4.最后phone_add()函数里面fp是用的“a”打开的,我在这添加的增加的数据啊 不知道为什么不行 您的方法具体我还是不太明白?
加载更多回复(4)

69,371

社区成员

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

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