PDA

View Full Version : مبتدی: مشکل با مفهوم تابع seekg (یک ماه بیشتره که روش گیر کردم)



vasilopita
جمعه 23 اردیبهشت 1390, 18:26 عصر
سلام. لطفا کد زیر که توی محیط کنسول ویژال نوشته شده رو اجرا کنید.
اول گزینه 1 رو بزنید بعد از گرفتن نام یه شماره حساب بهش بدید بعد بقیه درخواست ها رو هم جواب بدید بعد دوباره از منو گزینه 1 رو بزنید و همون شماره حساب قبلی رو بدید بعد از اینکه به شما گفت که شماره حساب قابل قبول نیست یه شماره جدید بهش بدید "اینجا مشکل خودش رو نشون میده" . لطفا کمکم کنید 1 ماه بیشتره که روش گیر کردم.
#include<fstream>
#include<iostream>
#include<conio.h>
#include<stdio.h>
using namespace std;
char menu();
void get_info();
struct customer
{
bool state;
char name[21];
int balance;
int account;
int kind;
customer()
{
state=0;
}
};
void main()
{
char chr;
while(1)
{
chr=menu();
switch(chr)
{
case'1': get_info(); break;
case '6':exit(0); break;
}
}
}
char menu()
{
char c;
cout<<"1: Enter Data\n6: Exit\n\a";
cin>>c;
return c;
}
void get_info()
{
customer cust1;
ofstream out("customer1.dat",ios::out|ios::binary);
ifstream in("customer1.dat",ios::in|ios::binary);
if(!in)
{
cout<<"EROR To Open File...\a\a\n";
exit(0);
}
int buffer;
cin.get();
cout<<"Please Enter The Below Information\n\a";
cout<<"Customer Name:\n";
cin.getline(cust1.name,20);
for(;;)
{
cout<<"Account Number:\n";
cin>>cust1.account;
buffer=cust1.account;
in.seekg(sizeof(struct customer)*cust1.account,ios::beg);
in.read((char *)&cust1,sizeof(struct customer));
if(cust1.state!=1)
break;
cout<<"This Account Number Is Not Availeable...\n\a";
}
in.close();
cout<<"Customer Balance:\n";
cin>>cust1.balance;
cout<<"Account Type:\n";
cin>>cust1.kind;
cust1.state=1;
out.seekp(sizeof(struct customer)*cust1.account,ios::beg);
out.write((char *)&cust1,sizeof(struct customer));
out.close();
}



از مسئولین سایت تقاضا دارم این پست رو پاک نکنن به خدا خیلی وقته روش گیر کردم هر کاری می کنم نمیشه :گریه:

tdkhakpur
شنبه 24 اردیبهشت 1390, 00:52 صبح
خب اونجا شما چه زمانی state رو تغیر میدید که بهش شرط میگذارید؟
در ضمن نباید توسط seekp به محلی اشاره کرد که عددها سری نیستن مثلا اگر عدد اول برای account شماره 100 قرار بگیره اونوقت شما نمیتوانید توسط seekp به مکان sizeof(struct customer)*cust1.account پرش کنید دلیلش اینه که هنوز چنین فضایبی داخل فایل وجود ندارد.
به همین دلیل باید این عدد رو بصورت سری و از شماره 1 شروع بشه و برای رکورهای بعد +1 بشه میتوانید این عدد رو با کد زیر برای مشتری های بعدی بصورت اتومات ارائه بدید.


in.seekg(0,ios::end);
cust1.account = in.tellg()/sizeof(struct customer);