PDA

View Full Version : سوال: جستوجو درفایل c++



minazare
چهارشنبه 05 مرداد 1390, 23:47 عصر
سلام
اگه یه فایل داشته باشیم و اطلاعات شیی از کلاس توش باشه و بخواییم مثلا کد ملی رو از ورودی بگیریم و سرچ کنیم که آیا اطلاعات فرد مورد نظر وجود داره یانه چه طور باید عمل کنیم؟
یه سوال دیگه :کد ملی ده رقمه و long intتا 2147483647عدد رو ساپرت میکنه پس برای ذخیره کدملی مناسب نیست.اگه charهم بزاریم سرچش سخت میشه.کار باstringهم بلد نیستم لطفا کمک کنید!

tdkhakpur
پنج شنبه 06 مرداد 1390, 12:37 عصر
اگه یه فایل داشته باشیم و اطلاعات شیی از کلاس توش باشه و بخواییم مثلا کد ملی رو از ورودی بگیریم و سرچ کنیم که آیا اطلاعات فرد مورد نظر وجود داره یانه چه طور باید عمل کنیم؟

هر شی که داخل فایل نوشته میشه یک ساختار به حساب میاد و طول ثابتی داره میتوانید با استفاده از همین طول ثابت توسط fread یا read جستجو رو انجام بدید اما اگه بانک شما بصور اصولی طراحی نشه جستجو خیلی کند خواهد شد.

یه سوال دیگه :کد ملی ده رقمه و long intتا 2147483647عدد رو ساپرت میکنه پس برای ذخیره کدملی مناسب نیست.اگه charهم بزاریم سرچش سخت میشه.کار باstringهم بلد نیستم لطفا کمک کنید!
به دلیل اینکه هیچ محاسبه ای رو کد ملی انجام نمیشه مثل جمع و تفریق یا .. بهتره برای کد ملی از رشته استفاده کنید برای srch از strcmp استفاده کنید.

simul8or
جمعه 07 مرداد 1390, 03:16 صبح
اگر برای ویندوز برنامه می نویسی و از visual studio استفاده می کنی، میتونی از نوع دادهunsigned long long یا __Int64 برای کد ملی استفاده کنی. کار کردن با string اصلا پیشنهاد نمیشه، عملیات مربوط به string بسیار وقت گیره و performance رو پایین میاره.


اگه یه فایل داشته باشیم و اطلاعات شیی از کلاس توش باشه...
منظورتون چیه؟؟ شی های کلاس درحافظه قرار می گیرند و با اشاره گر یا alias یا نام به آن دسترسی پیدا می کنید، شما باید فایل رو باز و اطلاعات رو بخونید. مگر اینکه منظور شما serialization باشه که توضیحش خارج از موضوعه.
برای ساختن این گونه فایل ها باید metadata فایل رو تغییر بدید، همچنین ساختار مشخصی برای فیلد ها انتخاب کنید. برای درک بهتر کتابهای سری ذخیره و بازیابی اطلاعات رو بخونید.

minazare
جمعه 07 مرداد 1390, 13:19 عصر
من با codeblocksبرنامه مینویسم. توی این محیطم میشه از unsigned long long استفاده کرد؟

برنامه ای که میخوام بنویسم مربوط به هتلداریه.توی این برنامه باید برای مشتری و هتلدار و اتاق ها جدا جدا کلاس درست کنم و اطلاعات گرفته شده رو توی فایلهای مخصوص بریزم(فایل مشتری و هتلدار و اتاق ها از هم جدا هستن)
بعدش کدملی رو از ورودی میگیرم تا ببینم مشتری قبلا اتاق رزو کرده یا نه.برای سرچ کد ملی مشتری توی فایل مشکل دارم .وقتی دیباگ میکنم انگار کل فایلو سرچ نمیکنه.
مولف این کتاب کیه؟

simul8or
جمعه 07 مرداد 1390, 14:24 عصر
من با codeblocksبرنامه مینویسم. توی این محیطم میشه از unsigned long long استفاده کرد؟کاربران لینوکس معمولا از codeblocks استفاده می کنند. در محیط ویندوز فقط Visual Studio مناسب است (personal opinion)
برنامه codeblocks از GCC به عنوان کامپایلر معمول خود استفاده می کند. شما با دانلود ورژن جدید برنامه می توانید از نوع long long استفاده کنید:
#include <iostream>
#include <inttypes.h>

int main()
{
uint64_t v1;
long long v2;

v1 = 900000000000000000LLU;
v2 = 900000000000000000LLU;
}
برای ذخیره کردن میتونی از روش زیر استفاده کنی:
برای فایل مشتری:
name=reza;
last=mohamadi;
PIN=5606578976;
#
name=saeed;
و...
این روش بهترین نیست. روش های زیادی وجود داره مثلا XML که اگه بتونی XML رو پارس کنی، راحت میتونی برنامه رو بنویسی.

minazare
جمعه 07 مرداد 1390, 15:56 عصر
میشه درباره XMLتوضیح بدی .نمیدونم چیه

simul8or
جمعه 07 مرداد 1390, 16:54 عصر
میشه درباره XMLتوضیح بدی .نمیدونم چیه
http://barnamenevis.org/showthread.php?4596-XML-%DA%86%DB%8C%D8%B3%D8%AA-%D8%9F
برای خواندن اطلاعات از xml باید از کتاب خانه های آماده مثل، TinyXML++ استفاده کنی.

BeginnerProgrammer
جمعه 07 مرداد 1390, 16:58 عصر
بعدش کدملی رو از ورودی میگیرم تا ببینم مشتری قبلا اتاق رزو کرده یا نه.برای سرچ کد ملی مشتری توی فایل مشکل دارم .وقتی دیباگ میکنم انگار کل فایلو سرچ نمیکنه.

شما باید اول از درستی ذخیره شدن رکوردها تو فایل مطمئن باشید، میتونید اونا رو تو خروجی چاپ کنید( اگه کدشو بذارین بهتر میشه کمک کرد).

minazare
جمعه 07 مرداد 1390, 23:21 عصر
int s=0,d=0,mar=0;
using namespace std;
//* * * * * * * * * * * * * * * * * * * * * * * * * *
class person{
char firstName[20];
char lastName[20];
enum marriage{married,single};
int yearB;
enum sex{man,woman};
public:
string numberParson;
friend ostream &operator<<(ostream &stream,person per );
friend istream &operator>>(istream &stream,person &per );
}per;
ostream &operator<<(ostream &stream,person per )
{
stream<<"\nFirst Name: "<<per.firstName;
stream<<"\nLast Name: "<<per.lastName;
stream<<"\nkode Meli: "<<per.numberParson;
stream<<"\nbirth year: "<<per.yearB;
switch(s)
{
case 0:stream<<"\nsex: man\n";break;
case 1:stream<<"\nsex: woman\n";break;
}
switch(mar)
{
case 0:stream<<"\nmarriage: married\n";break;
case 1:stream<<"\nmarriage: single\n";break;
}
return stream;
}
istream &operator>>(istream &stream,person &per ){
cout<<'\n'<<"please Enter First Name: "<<endl;
stream >>per.firstName;
cout<<"please Enter Last Name: "<<endl;
stream>>per.lastName;
cout<<"Please Enter Number of Kde Meli: "<<endl;
stream>>per.numberParson;
cout<<"Please Enter Birth Year: "<<endl;
stream>>per.yearB;
cout<<"Please Enter sex:(man:0 woman:1)"<<endl;
stream>>s;
cout<<"Please Enter position of marriage (married:0 single:1)"<<endl;
stream>>mar;
return stream;
}
//* * * * * * * * * * * * * * * * * * * * * * * * * *
class costumer:public person{
int numberFamily;
int numberRoom;
char nameHotel;
public:
friend ostream &operator<<(ostream &stream,costumer cost );
friend istream &operator>>(istream &stream,costumer &cost );
}cost;
ostream &operator<<(ostream &stream,costumer cost ){
stream<<"\nFamily Number: "<<cost.numberFamily;
stream<<"\nRoom Number: "<<cost.numberRoom;
stream<<"\nHotel Name: "<<cost.nameHotel;
stream<<"\n_______________________________\n";
return stream;
}
istream &operator>>(istream &stream,costumer &cost ){
cout<<"Please Enter Number of Family: "<<endl;
stream>>cost.numberFamily;
cout<<"Please Enter Number of Room: "<<endl;
stream>>cost.numberRoom;
cout<<"Please Enter Name of Hotel: "<<endl;
stream>>cost.nameHotel;
return stream;
}
void hozori()
{
string code;
cout<<"enter your numberof natio natility:";
cin>>code;
ifstream fcost1("costumer.h",ios::in | ios::binary);
fcost1.read((char *)&cost,sizeof(class costumer));
if(code==per.numberParson)
cout<<"find!";
}
//* * * * * * * * * * * * * * * * * * * * * * * * * *
int main()
{
fstream fcost("costumer.h",ios::in | ios::out | ios::binary);
if(!fcost){
cout<<"cannot open costumer file!";
return 1;
}
cin>>per;
cin>>cost;
fcost<<per;
fcost<<cost
return 0;

بخشید خیلی طولانیه نمیدونم حوصله تون میگیره نگاش کنید یا نه!
خط 73 به بعد که تابع حضوریه سرچ انجام میده...

BeginnerProgrammer
شنبه 08 مرداد 1390, 11:32 صبح
شما اونجایی که عملگرها رو سربارگذاری کردین دارین به صورت تکست تو فایلتون مینوسین در حالی که تو تابع سرچتون دارین از فایل به سایز کلاس مربوط به cost باینری از فایل میخونید و این خیلی اشتباس چون فرض کنید سایز کلاستون 13 هست ولی این 13 تو فایلتون شامل یک کلاس نمیشه. باید نوشتن تو فایلتونم باینری باشه در اونصورت میتونید از filename.read استفاده کنید

minazare
یک شنبه 09 مرداد 1390, 09:53 صبح
ممنون ولی چه طوری تو فایل به صورت باینری بنویسم؟کجارو باید عوض کنم .حسابی گیج شدم!!!!:افسرده:
الان داشتم پستا رو میخوندم دیدم شما هم قبلا این مشکلو داشتین و حلش کردین پس شما بهترین کسی هستین که میتونید کمکم کنید.

BeginnerProgrammer
یک شنبه 09 مرداد 1390, 10:13 صبح
به جای این قسمت از برنامه :


stream<<"\nFamily Number: "<<cost.numberFamily;
stream<<"\nRoom Number: "<<cost.numberRoom;
stream<<"\nHotel Name: "<<cost.nameHotel;
stream<<"\n_______________________________\n";

میتونید از دستور زیر استفاده کنید


stream.write((char*)&cost,sizeof(costumer));

همین کارو برای کلاس person هم انجام بدید.

minazare
سه شنبه 11 مرداد 1390, 23:58 عصر
سرچ باینری و متنی فرق داره؟
توی هر سایتو وکتابی رو نگاه میکنم سرچ توی فایل باینری رو گفته بعد ازش استفاده میکنم جواب نمیده.
char c;
char code[11];
cout<<"enter code";
cin>>code;
fcost.seekg(0,ios::beg);
while(!fcost.eof () ) {
fcost.get(c);
if(strcmp(per.numberperson,code)==0)
{
cout<<"find";
}

numberperson:کد ملی
fcost :فایلی که توش اطلاعات مشتری هست
اگه میشه یه راهنمایی بکنید.خیلی کلافم کرده

BeginnerProgrammer
چهارشنبه 12 مرداد 1390, 11:06 صبح
متغیر per از کجا اومده؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ چرا per.numberperson با code مقایسه میکنید؟ ؟؟؟؟؟؟؟؟؟ اصلا چرا یک کاراکتر یک کاراکتر از فایل میخونید؟؟؟؟؟؟؟؟؟این کاراکتری که میگیرید چه تاثیری رو روند اجرای برنامه داره؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ :متفکر:
شما باید هر دفعه از فایلتون به اندازه یک کلاس بخونید بعد متغیر numberperson این کلاسو با کدی که گرفتین مقایسه کنید !!!!!!!!!!!!!

minazare
چهارشنبه 12 مرداد 1390, 11:44 صبح
per شی کلاس personکه توش اطلاعات مشتری هست.
code از ورودی میگیرم باکد ملی مقایسه میکنم.
یعنی توی فایل جای numberpersonمشخصه ؟لازم نیس کارکتر کارکتر خونده بشه تا کد ملی رو پیدا کنه؟
stream.read((char*)&per,sizeof(person));
این دستورو شما دارین میگین؟
مگه این دستور واسه فایل باینری نیس؟

BeginnerProgrammer
چهارشنبه 12 مرداد 1390, 12:03 عصر
کدی که شما نوشتین per همیشه یک شی مشخصه وقتی دارین از فایلتون کارکتری میخونید بعد قسمت کد ملی per رو با کدی که گرفتین مقایسه میکنید در واقع در طول حلقه شما اصلا از چیزی که از فایل خوندین هیچ استفاده ای نکردین و شی مشخصیو هر سری با کد مقایسه میکنید که مطمئنا جواب نمیده .
اگه شما از دستور .write برای نوشتن تو فایل استفاده کردید میتونید از دستور .read


fcost.read((char*)&per,sizeof(person));

هم استفاده کنید و جای کد ملیم مشخصه.