PDA

View Full Version : یک برنامه برای کار با فایلها نوشتم ولی درست کار نمیکنه! مشکلش کجاست؟



shahab_sh
سه شنبه 19 دی 1385, 14:57 عصر
با سلام:لبخندساده:
من دارم با فایلها در c++ کار میکنم و برای تمرین یه برنامه نوشتم ولی به یه مشکل نسبتا عجیب برخوردم.:افسرده: البته این برنامه رو تکه تکه کامپایل کرده ام و هیچ مشکلی نداشت. ببینید برنامه باید اینجوری کار بکنه:
با استفاده از حلقه while از شما چندین اسم و شماره تلفن و میخواد و آنها رو در فایلphoneNo.dat ذخیره میکنه و برای خارج شدن از حلقه هم بجای اسم باید ctrl+z رو وارد کنید.
بعد میاد اسمها و شماره ها رو از فایل میخونه و لیست میکنه. بعدش از شما میخواد که یه اسم رو وارد کنید (اشکال برنامه همینجاست) اون اسم رو پیدا میکنه و از شما یه شماره تلفن جدید میخواد. شماره رو وارد میکنید و اطلاعات رو از اول توی یک فایل جدید به نام temp1.dat مینویسه. نوشتن اطلاعات که تموم شد، فایل phoneNo.dat رو delete میکنه و اسم فایل temp1.dat رو به phoneNo.dat تغییر میده. درواقع فایل رو ویرایش میکنه.
وقتی که دیباگش کردم متوجه شدم که وقتی میخوام اسم رو وارد کنم به دستور cin>>name2 که میرسه خودش دستور رو رد میکنه و برنامه تموم میشه. یعنی اصلا منتظر نمیشه که من یه اسم رو وارد کنم!
حالا من کد برنامه رو میزارم اینجا. جلوی اون دستور cin>>name2 هم با کامنت مشخص کردم.
خیلی ممنون میشم اگه بگید مشکل از کجاست.:لبخندساده:

#include<fstream.h>
#include<iostream.h>
#include<conio.h>
#include<string.h>

int main() {

char name[21],name2[21],phoneNo[21];
int i;

clrscr();
ofstream pno("phoneNo.dat");
if(!pno) {
cout << "\nunable to creat file!";
getch();
return 0;
}

while (1) {
cout << "Enter name, phone No. : ";
cin >> name;
if (!name[0])
break;
cin >> phoneNo;
pno << name << " " << phoneNo << " ";
}
pno.close();

viewlist:

ifstream pni("phoneNo.dat");
if(!pni) {
cout << "\nUnable to open file!";
getch();
return 0;
}
clrscr();
cout << "---Name----------------------PhoneNo.----------------";
for (i=3; ;i++) {
pni >> name >> phoneNo;
if(!name[0])
break;
gotoxy(4,i);
cout << name;
gotoxy(30,i);
cout << phoneNo;
}
pni.close();
cout << "\n\n-----------------------------------------------------";

cout << "\nEnter a name to search:";

cin >> name2; //***Problem is here!***

if (!name2[0])
return 0;

ofstream tmp1("temp1.dat");
ifstream pni2("phoneNo.dat");

while(1) {
pni2 >> name >> phoneNo;
if(!name[0])
break;
if(!strcmp(name,name2)) {
cout << "\nEnter a new phoneNo. for " << name2 << " : ";
cin >> phoneNo;
}
tmp1 << name << " " << phoneNo << " ";
}
tmp1.close();
pni2.close();
remove("phoneNo.dat");
rename("temp1.dat", "phoneNo.dat");
cout << "\n press a key to view the new list...";
goto viewlist;

}

user addi
سه شنبه 19 دی 1385, 15:10 عصر
برای گرفتن رشته همیشه از gets استفاده کن. به خصوص برای رشته هایی که بین اونها فاصله هم داری. برای خوندن از فایل هم میتونی از fgets استفاده کنی. فقط در نظر بگیر که باید طول رشته رو بهش حتما بدی.. و رشته هایی که تو فایل ذخیره می کنی یا باید همشون طول یکسان داشته باشند یا به یه روشی طول رشته ذخیره شده رو در فایلت ذخیره کنی.
برای نوشتن رشته هم از puts و fputs استفاده کن.

good luck

shahab_sh
چهارشنبه 20 دی 1385, 22:37 عصر
دستتون درد نکنه. امتحان کردم درست شد ولی برام سوال شده که بدونم آخه مشکل اون برنامه چی بود؟ چرا دستور cin رو خودش همینجوری رد میکرد؟
دستور gets رو استفاده کردم ولی یه مشکلی که این دستور داره اینه که خوندن رشته فقط با رسیدن به '\n' تموم میشه در صورتی که من میخوام مثلا با رسیدن به فاصله یا رسیدن به کاما تموم بشه؟
اگه یکی بتونه بگه مشک اون برنامه ی بالا چیه خیلی ممنون میشم.:لبخندساده:

mzjahromi
پنج شنبه 21 دی 1385, 06:48 صبح
دستتون درد نکنه. امتحان کردم درست شد ولی برام سوال شده که بدونم آخه مشکل اون برنامه چی بود؟ چرا دستور cin رو خودش همینجوری رد میکرد؟ cin و scanf به صورت عادی این مشکل رو دارن دلیلش هم اطلاعاتی هست که توی بافر میمونه.

دستور gets رو استفاده کردم ولی یه مشکلی که این دستور داره اینه که خوندن رشته فقط با رسیدن به '\n' تموم میشه در صورتی که من میخوام مثلا با رسیدن به فاصله یا رسیدن به کاما تموم بشه؟ می تونی از cin.getline استفاده کنی این تابع شبیه gets است ولی تعداد کاراکتر ها و کاراکتر پایان رو هم می گیره

shahab_sh
شنبه 23 دی 1385, 12:54 عصر
از همگی تشکر میکنم که وقت گذاشتید و جواب دادید :لبخندساده: