이 코드는 이진 파일과의 데이터 읽기/쓰기를 수행합니다. 여기서 modify()
은 사용자로부터 입력을 받아 파일에서 검색합니다. 발견되면 사용자에게 새 항목을 제공하라는 메시지가 표시되고 이전 항목이 대체됩니다. 나는 다음 항목이 여전히 수정 될 수는 없지만 그와 함께 파일의 내용이 중복 될 경우특정 항목을 수정하는 동안 파일의 모든 내용이 중복됩니다.
이 문제는 fwrite()
후 modify()
에서 나는의 while
루프 후 모든 것이 잘 될 것 break
하지만 경우 왜 그렇게?
처음에는 파일에 중복 된 항목이 없습니다. 그래서 내가 무엇을 기대합니까 비록 내가 사용하지 않으면 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);
}
당신이 호출되면 정의되지 않은 동작, 아무 것도 발생할 수 있습니다. 'fflush (stdin)'은 정의되지 않은 동작을 호출합니다. 여기서 물어보기 전에 정의되지 않은 동작의 알려진 모든 사례를 제거하십시오. 정의되지 않은 동작이 의미하는 바를 실제로 알지 못하는 것 같으니 그것에 대해 알아보십시오! – Olaf
@Olaf''''fflush (stdin)''''의 모든 현상이 제거되었습니다. 지금 확인하십시오. – ram619