نمایش نتایج 1 تا 9 از 9

نام تاپیک: خواندن و نوشتن در فایل با استفاده از vector

  1. #1

    خواندن و نوشتن در فایل با استفاده از vector

    سلام
    این کد چرا هیچی داخل فایل نمی نویسه؟
    فایل txt من خالی نشون داده می شه

    کد PHP:
    void CfiDlg::OnBnClickedButtons()
    {
    // TODO: Add your control notification handler code here
    CFile f;
    f.Open("e:\\test.txt",CFile::modeCreate|CFile::modeWrite);
    CArchive ar(&f,CArchive::store);
    double y;
    for (
    int i=0;i<u.size();i++)
    {
    y=u[i];
    ar<<y;
    }
    ar.Close();
    f.Close();

    }

    ایا اعداد double یا float یا int رو باید تبدیل به char یا string کنم بعد داخل فایل بنویسم؟
    یک کدی لازم دارم مثل بچه ادم اطلاعاتمو از دو تا vector همراه با چند عدد دیگر(مثلا یه دونه double و یه دونه float)داخل فایل save و سپس با کلید دیگری load کنه؟

  2. #2

    نقل قول: خواندن و نوشتن در فایل با استفاده از vector

    برنامه شما به درستی عمل می کند. پس از اجرا، حجم فایل را ببینید.

    دقت کنید که شما به شکل باینری در فایل ذخیره می کنید و با باز کردن فایل txt دقیقا همان داده یا اعداد را نمی بینید. فقط زمانی که از طریق خواندن توسط همین توابع داده ها را دریافت کنید، اعداد واقعی را می توانید دریافت و مشاهده کنید.

    مثال (خواندن به شیوه شما، با تغییراتی):

    CFile f;

    using namespace std;

    vector <int> u;
    u.push_back( 10 );
    u.push_back( 20 );

    f.Open(_T("c:\\test1.txt"), CFile::modeCreate|CFile::modeReadWrite);
    CArchive ar(&f,CArchive::store);

    CArchive ar(&f,CArchive::store);
    double y;
    for (int i=0;i<u.size();i++)
    {
    y=u[i];
    ar<<y;
    }

    ar.Close();
    f.Close();

    حال برای خواندن (به فایل نگاه نکنید، چون داده ها باینری هستند، باید load کنید تا داده ها دریافت شوند)، دقت کنید که modeCreate نباید استفاده شود و store به load تبدیل شود:

    CFile f;

    using namespace std;
    vector <double> u;

    f.Open(_T("c:\\test1txt"),CFile::modeReadWrite);
    CArchive ar(&f, CArchive::load);

    double y;
    for (int i=0;i<2;i++)
    {
    ar>>y;
    u.push_back(y);
    }
    ar.Close();
    f.Close();
    دقت کنید که باید طول Vector یا همان تعداد داده ها را نیز ذخیره کنید تا بدانید چند مرتبه باید از فایل بخوانید (برای راحتی حلقه for را 2 قرار دادم.)

    اگر چک کنید می بینید که داده ها در vector خواند می شوند، پس برنامه درست عمل می کند.

  3. #3
    کاربر دائمی آواتار 1485159
    تاریخ عضویت
    فروردین 1388
    محل زندگی
    NULL
    سن
    30
    پست
    886

    نقل قول: خواندن و نوشتن در فایل با استفاده از vector

    vector 

    یعنی چی؟

  4. #4

    نقل قول: خواندن و نوشتن در فایل با استفاده از vector

    نقل قول نوشته شده توسط 1485159 مشاهده تاپیک
    vector 
    یعنی چی؟
    یعنی چیزی شبیه لیست پیوندی که در استاندارد C++‎‎‎ پیاده سازی شده است و در کتابخانه STL هست.

    ایا اعداد double یا float یا int رو باید تبدیل به char یا string کنم بعد داخل فایل بنویسم؟
    اگز شما می خواهید یک فایل اسکی داشته باشید که کارکتر ها همانند سایر فایل های txt در آن ذخیره و قابل دیدن باشند، آنگاه باید همه اعداد را به رشته تبدیل کنید و سپس رشته را ذخیره کنید.

    باید از typeText استفاده کنید و به جای CFile نیز از CStdioFile استفاده کنید.
    gcvt برای تبدیل double به رشته.

    CStdioFile f;

    using namespace std;

    vector <double> u;

    u.push_back( 10.5 );
    u.push_back( 20.8 );

    f.Open(_T("c:\\test2.txt"), CFile::modeCreate | CFile::modeReadWrite | CFile::typeText );

    CString str;
    char numStr[_CVTBUFSIZE];

    for (int i=0;i<2;i++)
    {
    _gcvt( u[i], 12, numStr);

    str += numStr;
    str += ' ';
    }

    f.WriteString( str.GetBuffer(10) );

    f.Close();


  5. #5

    نقل قول: خواندن و نوشتن در فایل با استفاده از vector

    عزیز این که نوشتی فهمیدم من فکر می کردم فایل که باز کنم دیتاهاشو می شه دید
    حال اگه بخواییم دیتاهاشو ببینیم چی؟
    یعنی برنامه من طوریه که می خواهم تغییر یک پارامترو چک کنم و اگه بخوام دوباره اینارو بنویسم بخونم تا تاثیرشو ببینم حدودا 20 دقیقه طول می کشه
    در این حالت به نظرتون چیکار باید کرد؟

  6. #6

    نقل قول: خواندن و نوشتن در فایل با استفاده از vector

    در کد بالا چرا عدد 12 در gcvt نوشتی؟
    طول اعداد رو از کجا بفهمیم

  7. #7

    نقل قول: خواندن و نوشتن در فایل با استفاده از vector

    اگر می خواهید فایل txt معمولی باشد (اسکی) همان روشی که در پست قبلی با typeText گفتم باید استفاده کنید.

    روش باینری مزیت ان نسبت به روش اسکی فوق در این هست که شما حتما نباید کل فایل را بخوانید. از member های CFile استفاده کنید، برای خواندن و یا تغییر قسمتی از فایل.
    یعنی شما از CArchive استفاده نکنید.

    به راحتی از seek استفاده کنید و به بایت مورد نظر در فایل بروید و از آن بخوانید.

    مثلا double می دانید که 8 بایت هست، اگر شما 2 تا عدد double در فایل بریزید، می دانید که بایت 8 شروع داده دوم هست. پس به این شکل ابتدا اشاره گر را به بایت 8 ببرید و سپس آن را بخوانید:

    struct Data
    {
    double num1;
    };

    //--------------------
    CFile f;
    // open file

    Data data1;
    data1.num1 = 5.6;

    f.Seek( 8 , CFile::begin );
    f.Read(&data1, sizeof(data1) );

    از روش فوق اشاره گر به بایت 8 از اول فایل می رود.
    حال 8 بایت یعنی عدد double دوم را بخوانید.

    برای نوشتن هم به همین شکل:

    f.Seek( 8 , CFile::begin );
    f.Write(&data1, sizeof(data1) );



    همانطور که می بینید، ما از یک struct استفاده کردیم، شما می توانید مستقیم از همان double نیز استفاده کنید و در پارامتر دوم sizeof همان double را قرار دهید. دقت کنید که پارامتر اول در Write و Read رشته نیست، بلکه یک سری داده هست. یک double شامل 8 بایت هست، به نوعی 8 کارکتر.

  8. #8

    نقل قول: خواندن و نوشتن در فایل با استفاده از vector

    نقل قول نوشته شده توسط eemajid مشاهده تاپیک
    در کد بالا چرا عدد 12 در gcvt نوشتی؟
    طول اعداد رو از کجا بفهمیم
    بستگی به شما دارد، double نهایت 15 رقم دارد. بیشتر بگیرید مشکلی نیست، کمتر بگیرید اعداد باقیمانده به رشته تبدیل نمی شوند.

  9. #9

    نقل قول: خواندن و نوشتن در فایل با استفاده از vector

    واقعا ممنونم

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •