PDA

View Full Version : ذخیره امتیاز در فایل



fatemehmahdieh
یک شنبه 08 بهمن 1391, 23:47 عصر
سلام من می خواستم بدونم برای این که بتونم امتیاز ها یی را که تا حالا افراد بازی کرده اند به طور صعودی در فایل ذخیره کنم تا هر وقت که بازی کننده خواست اون ها رو مشاهده کنه البته باید امتیازا 5 تا باشه و با هر بازی بشتر اگر امتیازش از بازی کننده های قبلی بیشتر بود با اون ها جابه جا شه.:متفکر:
void compare(game newGame){
int sw=0;
int i=0;
FILE *highScoresFile;

rank(newGame.o_Number,newGame.sharpNumber);

highScoresFile=fopen("F:\\othello\\highScores.dat","wb");

for(i=0;(i<5)&&(!feof(highScoresFile));i++)
fread(&gamelist[i],sizeof(game),1,highScoresFile);

for(i=0;(sw==0) && (i<5);i++){

if(newGame.o_Number > gamelist[i].o_Number){
for(int j=4;j>=i;j--)
gamelist[j+1]=gamelist[j];
gamelist[i]=newGame;
sw=1; //agar switch 1 beshe yani dige nabayad moghayese kone va tamoom besehe
}//end if
}//end for

for(i=0;(i<5)&&(gamelist[i].o_Number>-1);i++)
fwrite(&gamelist[i],sizeof(game),1,highScoresFile);


fclose(highScoresFile);


}
اون قسمت تابع رنک واسه اینه که امتیاز بازی جدید رو که می خواد ذخیره کنه حساب کنه ببخشید که کدم به هم ریخته است:ناراحت:

smemamian
دوشنبه 09 بهمن 1391, 00:45 صبح
به این صورت که شما نوشتی هیچ کس کمکتون نمی کنه ! کدتون رو داخل تگ سی++ بذارین تا دوستان
بهتر و سریعتر راهنمایی کنن .

Behnam.B
دوشنبه 09 بهمن 1391, 01:08 صبح
سلام. اشکالاتی در برنامه شما که به نظرم رسید:
- چون قرار است اول فایل را بخوانید، باید با r+b آن را باز میکردید.و برای این که برای اجرای اول هم به مشکل بر نخورید میتوانید به این صورت بنویسید:
highScoresFile=fopen("F:\\othello\\highScores.dat" ,"r+b");
if(!highScoresFile)
highScoresFile=fopen("F:\\othello\\highScores.dat" ,"wb");
که البته شاید روش بهتری هم باشد!

- و البته این که قبل از نوشتن از fseek برای رفتن به ابتدای فایل باید استفاده کنید...

- شما می بایست تعداد امتیاز های موجود در فایل را در یک متغیر ذخیره کنید مثلا میتوان به i پس از به دست آوردن این تعداد مقدار دیگری نداد و از آن استفاده کرد. پس ادامه برنامه به این صورت در خواهد آمد:

for(int j=0;(sw==0) && (j<i);j++){
if(newGame.o_Number > gamelist[j].o_Number){
for(int k=4;k>=j;k--)
gamelist[k+1]=gamelist[k];
gamelist[j]=newGame;
if(i<5)i++;
sw=1; //agar switch 1 beshe yani dige nabayad moghayese kone va tamoom besehe
}//end if
}//end for

fseek(highScoresFile,0, SEEK_SET);
for(int j=0; j<i;j++)
fwrite(&gamelist[j],sizeof(game),1,highScoresFile);

fclose(highScoresFile);
}// end function


- همینطور تعریف gamelist فراموش شده!!
چون من نمیتونستم این کد رو امتحان کنم، شاید درست نباشه. به هر حال امیدوارم به دردتون بخوره...:لبخندساده:

fatemehmahdieh
دوشنبه 09 بهمن 1391, 12:29 عصر
به این صورت که شما نوشتی هیچ کس کمکتون نمی کنه ! کدتون رو داخل تگ سی++ بذارین تا دوستان
بهتر و سریعتر راهنمایی کنن .
میشه بهم بگید که تگ ++C چیه؟ از کجا باید پیداش کنم و کدم داخلش کپی کنم؟ :افسرده:

fatemehmahdieh
دوشنبه 09 بهمن 1391, 19:54 عصر
[QUOTE=Behnam.B;1687476]سلام. اشکالاتی در برنامه شما که به نظرم رسید:
- چون قرار است اول فایل را بخوانید، باید با r+b آن را باز میکردید.و برای این که برای اجرای اول هم به مشکل بر نخورید میتوانید به این صورت بنویسید:
highScoresFile=fopen("F:\\othello\\highScores.dat" ,"r+b");
if(!highScoresFile)
highScoresFile=fopen("F:\\othello\\highScores.dat" ,"wb");
که البته شاید روش بهتری هم باشد!

- و البته این که قبل از نوشتن از fseek برای رفتن به ابتدای فایل باید استفاده کنید...

- شما می بایست تعداد امتیاز های موجود در فایل را در یک متغیر ذخیره کنید مثلا میتوان به i پس از به دست آوردن این تعداد مقدار دیگری نداد و از آن استفاده کرد. پس ادامه برنامه به این صورت در خواهد آمد:

for(int j=0;(sw==0) && (j<i);j++){
if(newGame.o_Number > gamelist[j].o_Number){
for(int k=4;k>=j;k--)
gamelist[k+1]=gamelist[k];
gamelist[j]=newGame;
if(i<5)i++;
sw=1; //agar switch 1 beshe yani dige nabayad moghayese kone va tamoom besehe
}//end if
}//end for

fseek(highScoresFile,0, SEEK_SET);
for(int j=0; j<i;j++)
fwrite(&gamelist[j],sizeof(game),1,highScoresFile);

fclose(highScoresFile);
}// end function


- همینطور تعریف gamelist فراموش شده!!
چون من نمیتونستم این کد رو امتحان کنم، شاید درست نباشه. به هر حال امیدوارم به دردتون بخوره...:لبخندساده:[/QUکدتون وقتی وارد می کنم خطا منطقی می گیره چون وقتی من بازی برای بار اول انجام می دم در ابتدا هیچ فایلی وجود نداره که بخواد امتحان کنه که می تونه بخونه یا بنویسه در واقع اول چک می کنه که می تونه بخونه چون هیچ فایلی وجود نداره خطا می گیره

Behnam.B
دوشنبه 09 بهمن 1391, 23:06 عصر
سلام. من فکر میکنم قسمت لود کردن فایل رو باید به همون صورت نوشت. اما احتمالا اشکال برنامه تون از حلقه محاسبه i باشه. چون اولی باری که فایل را باز میکنید با wb باز میشود، fread روی آن هیچ کاری انجام نمیدهد. پس هیچگاه feof مقدارش true نخواهد شد. اتفاقا اشکال برنامه خودم هم همین بود!
پس احتمالا با نوشتن برنامه به این فرم مشکل شما حل شود:

void compare(game newGame){
int sw=0;
int i=0;
int fseek_returned;
FILE *highScoresFile;

rank(newGame.o_Number,newGame.sharpNumber);

highScoresFile=fopen("F:\\othello\\highScores.dat" ,"r+b");
if(!highScoresFile)
highScoresFile=fopen("F:\\othello\\highScores.dat" ,"wb");

i=-1;
do{
fseek_returned = fseek(highScoresFile, sizeof(game), SEEK_CUR);
i++;
}while(fseek_returned && i<4);

for(int j=0;(sw==0) && (j<=i);j++){
if(newGame.o_Number > gamelist[j].o_Number){
for(int k=4; k>=j; k--)
gamelist[k+1]=gamelist[k];
gamelist[j] = newGame;
if(i<4)i++;
sw=1; //agar switch 1 beshe yani dige nabayad moghayese kone va tamoom besehe
}//end if
}//end for

fseek(highScoresFile,0, SEEK_SET);
for(int j=0; j<=i; j++)
fwrite(&gamelist[j],sizeof(game),1,highScoresFile);

fclose(highScoresFile);
}// end function

fatemehmahdieh
سه شنبه 10 بهمن 1391, 00:06 صبح
[QUOTE=Behnam.B;1688200]سلام. من فکر میکنم قسمت لود کردن فایل رو باید به همون صورت نوشت. اما احتمالا اشکال برنامه تون از حلقه محاسبه i باشه. چون اولی باری که فایل را باز میکنید با wb باز میشود، fread روی آن هیچ کاری انجام نمیدهد. پس هیچگاه feof مقدارش true نخواهد شد. اتفاقا اشکال برنامه خودم هم همین بود!
پس احتمالا با نوشتن برنامه به این فرم مشکل شما حل شود:

void compare(game newGame){
int sw=0;
int i=0;
int fseek_returned;
FILE *highScoresFile;

rank(newGame.o_Number,newGame.sharpNumber);

highScoresFile=fopen("F:\\othello\\highScores.dat" ,"r+b");
if(!highScoresFile)
highScoresFile=fopen("F:\\othello\\highScores.dat" ,"wb");

i=-1;
do{
fseek_returned = fseek(highScoresFile, sizeof(game), SEEK_CUR);
i++;
}while(fseek_returned && i<4);

for(int j=0;(sw==0) && (j<=i);j++){
if(newGame.o_Number > gamelist[j].o_Number){
for(int k=4; k>=j; k--)
gamelist[k+1]=gamelist[k];
gamelist[j] = newGame;
if(i<4)i++;
sw=1; //agar switch 1 beshe yani dige nabayad moghayese kone va tamoom besehe
}//end if
}//end for

fseek(highScoresFile,0, SEEK_SET);
for(int j=0; j<=i; j++)
fwrite(&gamelist[j],sizeof(game),1,highScoresFile);

fclose(highScoresFile);
}// end function
[/QUOسلام ممنون از راهنماییتون یه مشکلی هست اینه که قسمت fread در برنامه شما نیست کد خودمم که fread داره می زنم اجرا نمی شه یه مشکل دیگه که در برنامه خودم که قبلا نوشته بودم و برنامه شما هست اینه که برنامه بدون خطا اجرا می شه اما وقتی فایل highScoresFile باز می کنم داخلش چیزی نیست.انگار که اصلا این تابع اجرا نشده.
یه سوال دیگه می شه شما بگید که تگ ++C چیه وکجاست که من کدم داخلش کپی کنم؟:لبخندساده:

Behnam.B
سه شنبه 10 بهمن 1391, 00:49 صبح
سلام. درسته خوندن از فایل رو باید بعد از do-while مینوشتم. برنامه رو یه تغییراتی دادم. امیدوارم درست شده باشه:

void compare(game newGame){
int sw=0;
int i=0;
int fseek_returned;
FILE *highScoresFile;

rank(newGame.o_Number,newGame.sharpNumber);

highScoresFile=fopen("F:\\othello\\highScores.dat" ,"r+b");
if(!highScoresFile)
highScoresFile=fopen("F:\\othello\\highScores.dat" ,"wb");

i=-1;
do{
fseek_returned = fseek(highScoresFile, sizeof(game), SEEK_CUR);
i++;
}while(fseek_returned && i<4);

if(i>0){
fseek(highScoresFile, 0, SEEK_SET);
fread(gamelist, sizeof(game), i, highScoresFile);

for(int j=0;(sw==0) && (j<=i);j++){
if(newGame.o_Number > gamelist[j].o_Number){
for(int k=4; k>=j; k--)
gamelist[k+1]=gamelist[k];
gamelist[j] = newGame;
if(i<5)i++;
sw=1;
}//end if
}//end for
else{
gamelist[0] = newGame;
i = 1;
}

fseek(highScoresFile, 0, SEEK_SET);
fwrite(gamelist,sizeof(game), i, highScoresFile);

fclose(highScoresFile);
}// end function


برای استفاده از تگ ++c باید بعد از paste کردن برنامه تون، اون رو سلکت کنید و دکمه ++c (بالای textbox) رو بزنید!

fatemehmahdieh
سه شنبه 10 بهمن 1391, 11:05 صبح
سلام. درسته خوندن از فایل رو باید بعد از do-while مینوشتم. برنامه رو یه تغییراتی دادم. امیدوارم درست شده باشه:

void compare(game newGame){
int sw=0;
int i=0;
int fseek_returned;
FILE *highScoresFile;

rank(newGame.o_Number,newGame.sharpNumber);

highScoresFile=fopen("F:\\othello\\highScores.dat" ,"r+b");
if(!highScoresFile)
highScoresFile=fopen("F:\\othello\\highScores.dat" ,"wb");

i=-1;
do{
fseek_returned = fseek(highScoresFile, sizeof(game), SEEK_CUR);
i++;
}while(fseek_returned && i<4);

if(i>0){
fseek(highScoresFile, 0, SEEK_SET);
fread(gamelist, sizeof(game), i, highScoresFile);

for(int j=0;(sw==0) && (j<=i);j++){
if(newGame.o_Number > gamelist[j].o_Number){
for(int k=4; k>=j; k--)
gamelist[k+1]=gamelist[k];
gamelist[j] = newGame;
if(i<5)i++;
sw=1;
}//end if
}//end for
else{
gamelist[0] = newGame;
i = 1;
}

fseek(highScoresFile, 0, SEEK_SET);
fwrite(gamelist,sizeof(game), i, highScoresFile);

fclose(highScoresFile);
}// end function


برای استفاده از تگ ++c باید بعد از paste کردن برنامه تون، اون رو سلکت کنید و دکمه ++c (بالای textbox) رو بزنید!بازم ممنون:لبخندساده:
چند تامشکل دارم اونم اینه که 1. می شه بگید که حلقه do\while برای چی استفاده کردید:متفکر: 2.وقتی اجرای حلقه do\while تمام می شه i مقدار 3 داره پس قسمت else اصلا اجرا نمی شه 3. شما { برای if نبستید که به نظر میاد که باید قبل else بسته بشه.4. وقتی بازی اجرا می کنم بار دوم اطلاعات بار اول پاک می شه یعنی روی همون اطلاعات اطلاعات نفر بعد چاپ می شه انگار تا حالا فقط یه نفر بازی کرده:خجالت:

Behnam.B
سه شنبه 10 بهمن 1391, 11:32 صبح
سلام. حلقه do-while رو برای به دست آوردن تعداد امتیاز های save شده در فایل استفاده کردم(از اول فایل، تا میتونه جلو میره و تعداد رو میشماره) و مقدار i پس از رد شدن از این حلقه این تعداد را نشان میدهد. و شرط if هم برای جدا کردن حالتی است که هیچ امتیازی در فایل ذخیره نشده(در واقع آن را تازه ایجاد کردیم) که در این حالت امتیاز جدید باید مستقیما وارد بشه...

در مورد { هم حق با شماست...:لبخندساده:

امیدوارم مشکل برنامه حل شده باشه

fatemehmahdieh
سه شنبه 10 بهمن 1391, 12:43 عصر
سلام. حلقه do-while رو برای به دست آوردن تعداد امتیاز های save شده در فایل استفاده کردم(از اول فایل، تا میتونه جلو میره و تعداد رو میشماره) و مقدار i پس از رد شدن از این حلقه این تعداد را نشان میدهد. و شرط if هم برای جدا کردن حالتی است که هیچ امتیازی در فایل ذخیره نشده(در واقع آن را تازه ایجاد کردیم) که در این حالت امتیاز جدید باید مستقیما وارد بشه...

در مورد { هم حق با شماست...:لبخندساده:

امیدوارم مشکل برنامه حل شده باشه
ببخشید ولی من مشکل2و 4 پست قبلی نفهمیدم مخصوصا مشکل4 :خجالت:
در مشکل2وقتی fseek انجام می شه به اندازه struct game جلو می ره و تا وقتی که i=3 جلو میره بدون توجه fseek_returned انگار اصلا این شرط چک نمی شه:متفکر:

Behnam.B
سه شنبه 10 بهمن 1391, 13:12 عصر
سلام ببخشید که اشکالاتون رو کامل نخونده بودم! احتمالا برنامه به این صورت جواب بده:
void compare(game newGame){
int sw=0;
int i=0;
bool writeNew = false;
game gamelist[6];
FILE *highScoresFile;

//rank(newGame.o_Number,newGame.sharpNumber); ??

highScoresFile=fopen("highScores.dat" ,"r+b");
if(!highScoresFile){
writeNew = true;
highScoresFile=fopen("highScores.dat" ,"wb");
}

if(!writeNew){
i=-1;
do{
i++;
fread(&gamelist[i], sizeof(game), 1, highScoresFile);
}while(!feof(highScoresFile));
}else
i =0;

if(i>0){
for(int j=0;(sw==0) && (j<=i);j++){
if(newGame.o_Number > gamelist[j].o_Number){
for(int k=4; k>=j; k--)
gamelist[k+1]=gamelist[k];
gamelist[j] = newGame;
if(i<5)i++;
sw=1;
}//end if
}//end for
}else{
gamelist[0] = newGame;
i = 1;
}

fseek(highScoresFile, 0, SEEK_SET);
fwrite(gamelist,sizeof(game), i, highScoresFile);

fclose(highScoresFile);
}// end function