此代码读/写二进制文件的数据。这里modify()
将从用户那里获取输入,在文件中搜索它。如果找到,将提示用户提供新条目,旧条目将被替换。
问题是,modify()
fwrite()
之后break
如果我while
break
循环,那么一切都会好的,但是,如果我不这样做的话仍然会被修改,但同时文件的内容会重复,为什么会这样?
与开始时一样,文件中没有重复的条目。 所以我期望的是,即使我不使用if(strcmp(e.name,user)==0)
,循环仍应继续,并在读取完整个文件后终止。这里,if
只对一个条目成立,因此控件应该只在此 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
void add(FILE *);
void list(FILE *);
void modify(FILE *);
struct emp
{
char name[20];
int id;
float sal;
}e;
void add(FILE *f)
{
char *p=NULL;
printf("\nEnter name id sal\n");
scanf(" %s %d %f", e.name,&e.id,&e.sal);
fseek(f,0,SEEK_END);
if((fwrite(&e,sizeof(struct emp),1,f))==1)
{
printf("\nAdded Successfully\n");
}
else
{
printf("\nError wrting to file in ADD func\n");
}
}
void list(FILE *f)
{
rewind(f);
while(fread(&e,sizeof(struct emp),1,f)>0)
{
printf("\nRead %s %d %f\n",e.name,e.id,e.sal);
}
}
void modify(FILE *f)
{
char user[20];
char *p=NULL;
printf("\nEnter name to modify\n");
scanf(" %s", user);
rewind(f);
while(fread(&e,sizeof(struct emp),1,f)==1)
{
//printf("\n --------------- %s %d %f\n",e.name,e.id,e.sal);
if(strcmp(e.name,user)==0)
{
//fseek(f,-sizeof(struct emp),SEEK_CUR);
printf("\nEnter new name id salary\n");
scanf(" %s %d %f", e.name,&e.id,&e.sal);
fseek(f,-sizeof(struct emp),SEEK_CUR);
if(fwrite(&e,sizeof(struct emp),1,f)==1)
{
printf("\nModified successfull!!\n");
//break;
}
else
{
printf("\nError while modifying\n");
}
}
else
{
printf("\n\nstring not matched\n\n");
}
}
}
int main()
{
char val='T';
FILE *fp=NULL;
if((fp=fopen("database.dat","rb+"))==NULL)
{
if((fp=fopen("database.dat","wb+"))==NULL)
{
printf("\nError opening file in wb+ mode\n");
exit(0);
}
}
do
{
printf("\nEnter a to add, l to list, d to delete, m to modify and e to exit\n");
scanf(" %c", &val);
switch(val)
{
case 'a':
add(fp);
break;
case 'l':
list(fp);
break;
case 'm':
modify(fp);
break;
case 'd':
// del(fp);
break;
case 'e':
fclose(fp);
exit(0);
break;
default:
printf("\nInvalid Input\n");
break;
}
}
while(1);
}
块中输入一次。然后条目如何重复?
Intent syncIntent = new Intent(this, ScanBLE_Service.class);
this.startService(syncIntent);
答案 0 :(得分:2)
我认为这是fread()
和fwrite()
之间的问题。
使用fwrite()修改emp
后,继续while
循环而不使用fseek()
。
事实上,在之前,你使用fseek()返回并且没关系。
现在你必须放置另一个不移动的fseek(),如下所示:
fseek(f, 0, SEEK_CUR);
现在你可以删除中断,你的Modify()
函数就像这样:
void modify(FILE *f)
{
char user[20];
printf("\nEnter name to modify\n");
scanf("%s",user);
fflush(stdin);
rewind(f);
while(fread(&e,sizeof(struct emp),1,f)==1)
{
if(strcmp(e.name,user)==0)
{
printf("\nEnter new name id salary\n");
scanf("%s %d %f",e.name,&e.id,&e.sal);
fflush(stdin);
fseek(f,-sizeof(struct emp),SEEK_CUR);
if(fwrite(&e,sizeof(struct emp),1,f)==1)
{
printf("\nModified successfull!!\n");
//break; //This can be removed
fseek(f, 0, SEEK_CUR); //Place this here
}
else
{
printf("\nError while modifying\n");
}
}
else
{
printf("\n\nstring not matched\n\n");
}
}
}