PDA

View Full Version : مشکل خیلی عجیب با نوشتن در فایل



pershianix
دوشنبه 09 فروردین 1389, 11:01 صبح
سلام. وقتی میخوام از طریق کد زیر که ظاهرا بدون مشکله توی یک فایل بنویسم با مشکل برمیخورمو و رکورد نوشته شده توی فایل، مثلا برای
The title Me 100 6
میشه:
The title جججججججججججججججMe ججججججججججججج بB

مشکل از کجاست؟

اینم کد:



#include<iostream>
#include<fstream>
using namespace std;
class Book
{
char title[20], author[15];
float price;
int quantity;
public:
void ask();
};
void Book::ask()
{
cout<<"\nWhat is the title? ";
cin.getline(title, 19);
cout<<"who is the author? ";
cin.getline(author, 14);
cout<<"What is the price? ";
cin>>price;
cout<<"how many are there? ";
cin>>quantity;
cin.get();
}
void main(){
Book book1, book2, book3;
ofstream outf("BOOK.DAT");
cout<<"*Book inventory*\n";
book1.ask();
outf.write((char*)&book1, sizeof(book1));

book2.ask();
outf.write((char*)&book2, sizeof(book2));

book3.ask();
outf.write((char*)&book3, sizeof(book3));
}

amin1softco
دوشنبه 09 فروردین 1389, 11:12 صبح
در حالت باینریه شما با نوتپد بازش نکن دوباره کلاس ها رو با خود دستورات سی بخونو چاپ کن هیچی عوض نشده:چشمک: یا از حالت تکست استفاده کن

pershianix
دوشنبه 09 فروردین 1389, 15:52 عصر
در حالت باینریه شما با نوتپد بازش نکن دوباره کلاس ها رو با خود دستورات سی بخونو چاپ کن هیچی عوض نشده:چشمک: یا از حالت تکست استفاده کن



این کارم کردم جواب نداد. من اینبار از کد ساده ی زیر استفاده کردم:


#include<iostream>
#include<fstream>
using namespace std;

void main(){
int a=123;
ofstream oFile("myFile.dat");
oFile.write((char*)&a, sizeof(a));
oFile.close();
ifstream iFile("myFile.dat");
int b;
iFile>>b;
cout<<b;



حالا بجای اینکه توی فایل عدد 123 نوشته بشه علامت } نوشته میشه و موقع خوندن فایل و چاپ مقدار توی خروجی عدد عجیب غریب 858993460- چاپ میشه

amin1softco
دوشنبه 09 فروردین 1389, 19:37 عصر
این کد رو امتحان کنید


#include<iostream>
#include<fstream>

using namespace std;

void main(){
int a=123;
ofstream oFile("myFile.dat");
oFile.write((char*)&a, sizeof(a));
oFile.close();
ifstream iFile("myFile.dat");
int b;
iFile.read((char*)&b, sizeof(int));
cout<<b;
}

pershianix
سه شنبه 10 فروردین 1389, 11:27 صبح
ممنون. این بار درست کار میکنه. فقط ممنون میشم میشم دلیل cast کردن دوباره رو بنویسید. البته معلومه که چرا دوباره cast شده اما میخوام بدونم دلیلی که واسه cast دوباره دارم، درسته یا نه. در ضمن توی کتاب C++ how to program از دایتل، تمامی مثالهایی که زده بدون استفاده از casting دوباره واسه خوندن و استفاده از read بوده.

یه سوال دیگه: اگه بخواییم با همین write یک رشته رو توی فایل بنویسیم باید چکار کنیم؟ من این کارو میکنم منتها فضاهای خالی که واسه جدا کردن کلمه ها از هم استفاده میشه با کاراکترهای عجیب غریب پر میشه.

بازم ممنون.

amin1softco
سه شنبه 10 فروردین 1389, 12:51 عصر
ببین شما به این مثال ها یک نگاهی بنداز
http://www.cplusplus.com/doc/tutorial/files/

بعدش بهترین راه برای کار با رشته ها در این حالت به نظر من استفاده از عملر های << و >> است

pershianix
سه شنبه 10 فروردین 1389, 16:11 عصر
اتفاقا دو سه روز پیش، بخش فایلهای سایت cplusplus.com رو خونده بودم. عالی بود منتها در مورد ارسال رشته به فایل باینری چیزی توی اون آموزش گفته نشده.

در ضمن، من خودم از عملگرهای <<>> واسه فرستادن رشته به فایل txt استفاده میکنم اما موضوع اینه که با فایل باینری فکر نکنم بشه اینطور برخورد کرد. آخه اگه با عملگر >> توی یه فایل باینری رشته ای ریخته بشه، موقع خوندن فایل و اختصاص بلاک حافظه به اون فایل باینری، تکلیف فضاهای خالی رشته چی میشه؟ همون بحث کاراکترهای عجیب غریب، با cout کردن داده های خونده شده پیش میاد.

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