سؤال

مع هذا الرمز حاولت طباعة السلسلة "Foo" 10 مرات بتنسيق ثنائي.ولكن لماذا لا تعمل الوظيفة للقيام بذلك؟

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

template <typename T> void WriteStr2BinFh (string St, ostream &fn) {
     for (unsigned i = 0; i < St.size(); i++) {
         char CStr = St[i];
         fn.write(&CStr.front(), CStr.size());
     }
     return;
}

int main() {
   string MyStr = "Foo";
   ofstream myfile;
   myfile.open("OuputFile.txt", ios::binary|ios::out);

   // We want to print it 10 times horizontally
   // separated with tab

  for (int i = 0; i < 9; i++) {
      WriteStr2BinFh(Mystr+"\t", myfile);
   }

   myfile.close();   
}
هل كانت مفيدة؟

المحلول

وهناك حتى الخطأ كثيرا هنا، وأنا مجرد الذهاب الى قائمة كل شيء أرى:

ويجب أن يكون لديك لحلقة حالة I <10.

لماذا أنت باستخدام قالب ولكن ليس templatized المعلمة T؟

أنت تدعو الجبهة طريقة () على كستر، ولكن كستر هو شار، وليس سلسلة، لذلك أنا لا أعرف حتى كيف أن يجمع.

وعلى افتراض كان كستر سلسلة، كنت لا تريد أن تأخذ عنوان مكرر الجبهة () باستخدام و، بدلا من ذلك كنت أريد أن أقول شيئا مثل:

fn.write(St.c_str(), St.size());

وكنت لا ترغب في حلقة لSt.size () تكرارات. فقط تفعل ما ورد أعلاه.

نصائح أخرى

يا إلهي، فيه أخطاء كثيرة:

  • int main - يجب أن يُرجع القيمة؛
  • لا تستخدم القالب< typename T > في وظيفتك؛
  • Mystr - الاسم غير صحيح في استدعاء الوظيفة، الأسماء في c++ حساسة لحالة الأحرف؛
  • char CStr - لا يحتوي على طريقة أمامية، وstd::string أيضًا؛
  • لا يمكنك الحصول على عنوان العنصر الأول كما هو الحال مع المتجه؛
  • سيكون من الأفضل أن تقبل std::string كمرجع ثابت؛
  • لقد نسيت تضمين رأس السلسلة؛
  • ...

تم إصلاح المثال الخاص بك، مع تنظيم التعليمات البرمجية الخاصة بك وتسميتك:

#include <iostream>
#include <fstream>
#include <string>

void WriteStr2BinFh( const std::string& St, std::ostream &out ) 
{
    out.write( St.c_str(), St.size() );
}

int main() 
{
    std::string MyStr = "Foo";
    std::ofstream myfile( "OuputFile.txt", std::ios::binary | std::ios::out );


    for (size_t i = 0; i < 9; ++i) 
    {
        WriteStr2BinFh( MyStr+"\t", myfile );
    }

   myfile.close();   
   return 0;
}

لكني أوصيت باستخدامه std::fill_n خوارزمية

std::fill_n( std::ostream_iterator< std::string >( myfile, "\t" ), 10, MyStr );

أولا، يقول char CStr التي CStr حرف واحد. ثانيا، fn.write(&CStr.front(), CStr.size()); يعامل هذا الحرف كما حاوية، مثل std::vector<>، والتي بالطبع لا يمكن ترجمة.

وإذا افترضنا أن كل شيء حتى WriteStr2BinFh على ما يرام، وأنا لم فحصها، وهذه هي الطريقة التي ينبغي WriteStr2BinFh (يمكن) نظرة:

void WriteStr2BinFh(const string& St, ostream &fn)
{
    for(string::iterator it = St.begin(); it != St.end(); ++it)
    {
        fn.put(*it);
    }
}

وأو من الأفضل

void WriteStr2BinFh(const string& St, ostream &fn)
{
    fn.write(St.c_str(), St.length());
}

نقاط مهمة للقيام بعملية io في الوضع الثنائي:

  • يجب فتح الملف في وضع الإخراج والوضع الثنائي باستخدام العلامتين ios::out (وضع الإخراج) وios::binary (الوضع الثنائي)
  • تأخذ وظيفة الكتابة معلمتين.المعلمة الأولى من النوع char* للبيانات المراد كتابتها والثانية من النوع int التي تطلب حجم البيانات المراد كتابتها في الملف الثنائي.
  • يجب إغلاق الملف في النهاية.

    void write_to_binary_file(WebSites p_Data)
    {
        fstream binary_file("c:\\test.dat",ios::out|ios::binary|ios::app);
        binary_file.write(reinterpret_cast<char *>(&p_Data),sizeof(WebSites));
        binary_file.close();
    }
    

    تقوم وظيفة الإدخال/الإخراج الثنائية بكتابة بعض البيانات إلى الوظيفة.

  • يتم فتح الملف في وضع الإخراج والوضع الثنائي باستخدام ios::out وios::binary.هناك محدد آخر ios::app، والذي يخبر نظام التشغيل بأن الملف مفتوح أيضًا في وضع الإلحاق.وهذا يعني أنه سيتم إلحاق أي مجموعة جديدة من البيانات بنهاية الملف.

  • تحتاج وظيفة الكتابة المستخدمة أعلاه إلى المعلمة كنوع مؤشر للأحرف.لذلك نستخدم محول النوع reinterpret_cast لطباعة البنية في نوع char*.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top