PDA

View Full Version : مشکل در جستجو در فایل دودویی



mahdi.manian
جمعه 12 دی 1393, 16:07 عصر
با سلام.

من در برنامه نویسی سی پلاس پلاس، قصد سرچ در فایل دودویی دارم (محیط توسه: Turbo c)

کد من:

struct {
char name[20];
char family[20];
char address[100];
char birthday[8];} members[100];

clrscr();
pt=fopen("members.dat","r");
rewind(pt);
char searchName[20];
int found=0;
printf("Please enter search word \n");
scanf("%s", &searchName);
int i=0;
while(!feof(pt)){
i++;
fseek (pt,sizeof(members[i]), 0);
fread(&members[i], sizeof(members[i]), i,pt);
if(searchName==members[i].name){
found=1;
break;}
}


clrscr();
if(found==1){
printf("Found! \n");
printf("%s \n", members[1].name);
printf("%s \n", members[1].family);
printf("%s \n", members[1].address);
printf("%s \n", members[1].birthday);
}
if(found==0){
printf("Not Found");
}



در این فایل من قبلا به درستی در Name مقدار ذخیره کرده ام و وقتی آن را با دستور fread باز یابی می کنم درست کار می کنه اما کد بالا برای سرچ کار نمی کنه و همیشه Not found میده.


ممنون میشم راهنمایی کنید. باتشکر.

job_c_1392
جمعه 12 دی 1393, 23:05 عصر
خط 16 جایش درست است؟
در خط 19باید از strcmp یا مشابه آن استفاده کنی (مقایسه دو رشته)

saber2298
شنبه 13 دی 1393, 11:15 صبح
سلام. این سورس بصورت کامل در لینک زیر موجوده.
http://www.sourcebaran.com/category/%d8%a2%d9%85%d9%88%d8%b2%d8%b4/%d9%be%d8%b1%d9%88%da%98%d9%87/%d8%b3%db%8c-%d9%be%d9%84%d8%a7%d8%b3-%d9%be%d9%84%d8%a7%d8%b3-%d8%b3%d9%88%d8%b1%d8%b3

mahdi.manian
پنج شنبه 18 دی 1393, 20:16 عصر
با سلام.

مشکل پیدا کردن حل شد ولی مشکل جدید اینه که همه را نمی تونه پیدا کنه! الان اگه 10 رکورد وارد فایل کنیم، رکورد اول و سه چهار تا رکورد آخر را نمی شناسه!
از دستور fseek برای حرکت کردن در فایل استفاده کردم و فکر کنم یه جایی توی این دستور اشتباه کردم.

یه تابع هم واسه نمایش همه رکورد های فایل نوشتم که اون هم دقیقا مشکل جستجو را داره و نمی تونه همه رکورد ها را پیدا کنه و همیشه رکورد اول و چند تا از رکورد های آخر هم پیدا نمیشن.

کد های من:

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void myMembers();
void myMembersReport();


struct {
char name[20];
char family[20];
char address[100];
char birthday[8];} members, listmembers[100];


void main(){
clrscr();
printf("\t\t\t-----------------------------\n");
printf("\t\t\t---1.Members ---\n");
printf("\t\t\t---2.Members Report ---\n");
printf("\t\t\t---3.Exit ---\n");
printf("\t\t\t-----------------------------\n");
printf("\n\n\n\t\t\t---Designed by Mahdi Manian--\n");
printf("\n\t\t\t-------www.joomiran.com------\n");


int c;
scanf("%d", &c);
switch(c){
case 1:
myMembers();
break;
case 2:
myMembersReport();
break;
case 3:
exit(0);
break;
}
getch();
}






void myMembers(){
clrscr();
printf("\t\t\t-----------------------------\n");
printf("\t\t\t---1.Add a new member ---\n");
printf("\t\t\t---2.Search members ---\n");
printf("\t\t\t---3.Edit a member ---\n");
printf("\t\t\t---4.Delete a member ---\n");
printf("\t\t\t---5.Back ---\n");

int c;
scanf("%d", &c);
switch(c){
case 1:
FILE *pt;
pt=fopen("members.dat","ab");
clrscr();
printf("\t Please Enter Data for new member");
printf("\n Please enter Name:");
scanf("%s", &members.name );
printf("Please enter Family:");
scanf("%s", &members.family );
printf("Please enter Address:");
scanf("%s", &members.address);
printf("Please enter Birthday:");
scanf("%s", &members.birthday);
fwrite(&members, sizeof(members), 1,pt);
fclose(pt);
myMembers();
break;


case 2:
clrscr();
pt=fopen("members.dat","rb");
rewind(pt);
char searchName[20];
int found=0;
printf("Please enter search word \n");
scanf("%s", &searchName);
int i=0;
while(!feof(pt)){
i++;
fseek(pt, (i)*sizeof(members) , SEEK_SET);
fread(&members, sizeof(members), i,pt);
if(strcmp(searchName,members.name)==0){
found=1;
break;}
}


clrscr();
if(found==1){
printf("Found! \n");
printf("Member Name:");
printf("%s \n", members.name);
printf("Member Family:");
printf("%s \n", members.family);
printf("Member Address:");
printf("%s \n", members.address);
printf("Member Birthday:");
printf("%s \n", members.birthday);
}
if(found==0){
printf("Not Found");
}
fclose(pt);


printf("\n Are you ready for back?(0/1)");
int x;
scanf("%d", &x);
if(x==1)
myMembers();
if(x==0)
exit(0);
break;


case 3:
clrscr();
pt=fopen("members.dat","wb+");
rewind(pt);
char replaceName[20];
found=0;
printf("Please enter search word \n");
scanf("%s", &searchName);
printf("Please enter replace word \n");
scanf("%s", &replaceName);
i=0;
while(!feof(pt)){
i++;
fseek(pt, (i)*sizeof(members) , SEEK_SET);
fread(&members, sizeof(members), i,pt);
if(strcmp(searchName,members.name)==0){
found=1;
strcpy(members.name,replaceName);
fwrite(&members, sizeof(members), i,pt);
break;}
}


clrscr();
if(found==1){
printf("Replace successful!");
}
if(found==0){
printf("Not Found");
}
fclose(pt);


printf("\n Are you ready for back?(0/1)");
x=2;
scanf("%d", &x);
if(x==1)
myMembers();
if(x==0)
exit(0);
break;


case 4:
clrscr();
pt=fopen("members.dat","wb+");
rewind(pt);
found=0;
printf("Please enter name to delete \n");
scanf("%s", &searchName);
i=0;
while(!feof(pt)){
i++;
fseek(pt, (i)*sizeof(members) , SEEK_SET);
fread(&members, sizeof(members), i,pt);
if(strcmp(searchName,members.name)==0){
found=1;
strcpy(members.name,"");
strcpy(members.family,"");
strcpy(members.address,"");
strcpy(members.birthday,"");
fwrite(&members, sizeof(members), i,pt);
break;}
}


clrscr();
if(found==1){
printf("Delete successful!");
}
if(found==0){
printf("Not Found");
}
fclose(pt);
printf("\n Are you ready for back?(0/1)");
x=2;
scanf("%d", &x);
if(x==1)
myMembers();
if(x==0)
exit(0);
break;


case 5:
main();
}
}






void myMembersReport() {
clrscr();
FILE *pt;
pt=fopen("members.dat","rb");
rewind(pt);
int i=0;
printf("List of members \n");
printf("Name: \t\t");
printf("Family: \t\t");
printf("Address: \t\t");
printf("Birthday: \n");
do{
i++;
fseek(pt, (i)*sizeof(members) , SEEK_SET);
fread(&listmembers[i], sizeof(listmembers[i]), i,pt);
printf("%s \t\t", listmembers[i].name);
printf("%s \t\t", listmembers[i].family);
printf("%s \t\t", listmembers[i].address);
printf("%s \n", listmembers[i].birthday);
}while(!feof(pt));
fclose(pt);


printf("\n\n Are you ready for back?(0/1)");
int x;
scanf("%d", &x);
if(x==1)
main();
if(x==0)
exit(0);
}


در کد های بالا من دستوراتی برای ویرایش اطلاعات و حذف گذاشتم که آنها هم کار می کنند ولی مشکل بزرگی که دارند این هست که اطلاعات قبلی را حذف می کنند! مثلا اگه رکورد 10 را ویرایش یا حذف کنیم رکورد های 1 تا 9 حذف می شوند! لطفا در صورت امکان این مورد را هم راهنمایی کنید. البته مشکل سرچ خیلی برام مهم تره.

محیط توسعه ام turbo c++ هست و کد های بالا را می توانید مستقیم داخل این نرم افزار قرار داده و کار کنید.

با تشکر.

job_c_1392
پنج شنبه 18 دی 1393, 21:36 عصر
با سلام
قبلا گفتم جای خط 89 اشتباه است باید بیاد بعد از خط 91 (تا اولین رکورد رو پیدا کنه)
این کار را برای قسمتهای دیگر هم انجام بده
هنگام نوشتن برای ویرایش یکبار دیگر از fseek استفاده کن

mahdi.manian
جمعه 19 دی 1393, 00:12 صبح
ممنون انجام دادم ولی مشکل حل نشد. فقط هم مشکل این نیست که رکورد اول را نمی خونه غیر از این اگه رکورد ها بیشتر از 5 تا بشه چند تا از آخرین رکورد ها را هم نمی خونه.

در مورد مشکل ویرایش و حذف هم کاری که نگفتید را انجام دادم مشکل حل نشد.

لطفا در صورت امکان این کد ها را در توربو سی ++ قرار بدید و ببینید مشکلش چی هست.

با تشکر

mahdi.manian
جمعه 19 دی 1393, 14:33 عصر
دوستان فردا باید پروژه را تحویل بدم. کسی نظری نداشت؟

job_c_1392
شنبه 20 دی 1393, 04:26 صبح
تغییرات زیر را انجام بده

---------------------------------------------------------------------------------------------------------------------------------------------------------


fseek(pt, (i)*sizeof(members) , SEEK_SET);
fread(&members, sizeof(members), 1,pt);

-------------------------------------------------------------------------------------------------------------------------------------------------------------

fseek(pt, (i)*sizeof(members) , SEEK_SET);
fwrite(&members, sizeof(members), 1,pt);
================================================== ========================================
خط i++ را به انتهای حلقه قبل از { منتقل کن

mahdi.manian
شنبه 20 دی 1393, 16:25 عصر
با روش شما مشکل حل نشد. به i در fseek مقدار -1 اضافه کردم مشکل اول حل شد.
ولی برای مشکل دوم کاری نتونستم بکنم.

job_c_1392
شنبه 20 دی 1393, 20:20 عصر
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void myMembers();
void myMembersReport();


struct {
char name[20];
char family[20];
char address[100];
char birthday[8];} members, listmembers[100];



void main(){
clrscr();
printf("\t\t\t-----------------------------\n");
printf("\t\t\t---1.Members ---\n");
printf("\t\t\t---2.Members Report ---\n");
printf("\t\t\t---3.Exit ---\n");
printf("\t\t\t-----------------------------\n");
printf("\n\n\n\t\t\t---Designed by Mahdi Manian--\n");
printf("\n\t\t\t-------www.joomiran.com------\n");


int c;
scanf("%d", &c);
switch(c){
case 1:
myMembers();
break;
case 2:
myMembersReport();
break;
case 3:
exit(0);
break;
}
getch();
}






void myMembers(){
clrscr();
printf("\t\t\t-----------------------------\n");
printf("\t\t\t---1.Add a new member ---\n");
printf("\t\t\t---2.Search members ---\n");
printf("\t\t\t---3.Edit a member ---\n");
printf("\t\t\t---4.Delete a member ---\n");
printf("\t\t\t---5.Back ---\n");

int x;
int i;
int found=0;


int c;
scanf("%d", &c);
switch(c){
case 1:
FILE *pt;
pt=fopen("members.dat","ab");
clrscr();
printf("\t Please Enter Data for new member");
printf("\n Please enter Name:");
scanf("%s", &members.name );
printf("Please enter Family:");
scanf("%s", &members.family );
printf("Please enter Address:");
scanf("%s", &members.address);
printf("Please enter Birthday:");
scanf("%s", &members.birthday);
fwrite(&members, sizeof(members), 1,pt);
fclose(pt);
myMembers();
break;


case 2:
clrscr();
pt=fopen("members.dat","rb");
rewind(pt);
char searchName[20];
// int found=0;
found=0;
printf("Please enter search word \n");
scanf("%s", &searchName);
// int i=0;
i=0;
while(!feof(pt)){
//i++;
fseek(pt, (i)*sizeof(members) , SEEK_SET);
fread(&members, sizeof(members), 1,pt);
i++;
if(strcmp(searchName,members.name)==0){
found=1;
break;}
}


clrscr();
if(found==1){
printf("Found! \n");
printf("Member Name:");
printf("%s \n", members.name);
printf("Member Family:");
printf("%s \n", members.family);
printf("Member Address:");
printf("%s \n", members.address);
printf("Member Birthday:");
printf("%s \n", members.birthday);
}
if(found==0){
printf("Not Found");
}
fclose(pt);


printf("\n Are you ready for back?(0/1)");
// int x;
scanf("%d", &x);
if(x==1)
myMembers();
if(x==0)
exit(0);
break;


case 3:
clrscr();
pt=fopen("members.dat","wb+");
rewind(pt);
char replaceName[20];
found=0;
printf("Please enter search word \n");
scanf("%s", &searchName);
printf("Please enter replace word \n");
scanf("%s", &replaceName);
i=0;
while(!feof(pt)){
// i++;
fseek(pt, (i)*sizeof(members) , SEEK_SET);
fread(&members, sizeof(members),1,pt);

if(strcmp(searchName,members.name)==0){
found=1;
strcpy(members.name,replaceName);
fseek(pt, (i)*sizeof(members) , SEEK_SET);
fwrite(&members, sizeof(members), i,pt);
break;}


i++;
}


clrscr();
if(found==1){
printf("Replace successful!");
}
if(found==0){
printf("Not Found");
}
fclose(pt);


printf("\n Are you ready for back?(0/1)");
x=2;
scanf("%d", &x);
if(x==1)
myMembers();
if(x==0)
exit(0);
break;


case 4:
clrscr();
pt=fopen("members.dat","wb+");
rewind(pt);
found=0;
printf("Please enter name to delete \n");
scanf("%s", &searchName);
i=0;
while(!feof(pt)){
// i++;
fseek(pt, (i)*sizeof(members) , SEEK_SET);
fread(&members, sizeof(members), 1,pt);

if(strcmp(searchName,members.name)==0){
found=1;
strcpy(members.name,"");
strcpy(members.family,"");
strcpy(members.address,"");
strcpy(members.birthday,"");
break;}
i++;
}


clrscr();
if(found==1){
printf("Delete successful!");
}
if(found==0){
printf("Not Found");
}
fclose(pt);
printf("\n Are you ready for back?(0/1)");
x=2;
scanf("%d", &x);
if(x==1)
myMembers();
if(x==0)
exit(0);
break;


case 5:
main();
}
}






void myMembersReport() {
clrscr();
FILE *pt;
pt=fopen("members.dat","rb");
rewind(pt);
int i=0;
printf("List of members \n");
printf("Name: \t\t");
printf("Family: \t\t");
printf("Address: \t\t");
printf("Birthday: \n");
do{
// i++;
fseek(pt, (i)*sizeof(members) , SEEK_SET);
fread(&listmembers[i], sizeof(listmembers[i]),1,pt);
i++;
printf("%s \t\t", listmembers[i].name);
printf("%s \t\t", listmembers[i].family);
printf("%s \t\t", listmembers[i].address);
printf("%s \n", listmembers[i].birthday);
}while(!feof(pt));
fclose(pt);


printf("\n\n Are you ready for back?(0/1)");
int x;
scanf("%d", &x);
if(x==1)
main();
if(x==0)
exit(0);
}