سؤال

C++ ملف I/O هو أقوى من C ملف I/O.حتى في C++ إنشاء مكتبة جديدة على ملف I/O هو مفيد أم لا ؟ أعني <fstream> يمكن لأي شخص من فضلك قل هل هناك أي فوائد في C++ ملف I/O ؟

هل كانت مفيدة؟

المحلول

الرأي

أنا لا أعرف من أي مشروع يستخدم C++ تيارات.فهي بطيئة جدا و من الصعب استخدام.هناك العديد من أحدث المكتبات مثل FastFormat و دفعة النسخة التي تدعي أن تكون أفضل كان هناك قطعة في الماضي ACCU الزائد مجلة عنهم.أنا شخصيا استخدمت ملف c المكتبة لمدة 15 عاما أو حتى في C++ و أنا لا أرى أي سبب حتى الآن إلى تغيير.

السرعة

هنا هو اختبار صغير برنامج (أنا تدق معا بسرعة) لإظهار الأساسية مشكلة السرعة:

#include <stdio.h>
#include <time.h>

#include<iostream>
#include<fstream>

using namespace std;

int main( int argc, const char* argv[] )
    {
    const int max = 1000000;
    const char* teststr = "example";

    int start = time(0);
    FILE* file = fopen( "example1", "w" );
    for( int i = 0; i < max; i++ )
        {
        fprintf( file, "%s:%d\n", teststr, i );
        }
    fclose( file );
    int end = time(0);

    printf( "C FILE: %ds\n", end-start );

    start = time(0);
    ofstream outdata;
    outdata.open("example2.dat");
    for( int i = 0; i < max; i++ )
        {
        outdata << teststr << ":" << i << endl;
        }
    outdata.close();
    end = time(0);

    printf( "C++ Streams: %ds\n", end-start );

    return 0;
    }

و النتائج على جهاز الكمبيوتر:

C FILE: 5s
C++ Streams: 260s

Process returned 0 (0x0)   execution time : 265.282 s
Press any key to continue.

كما يمكننا أن نرى فقط هذا مثال بسيط هو 52x أبطأ.وآمل أن هناك طرق لجعلها أسرع!

ملاحظة: تغيير endl إلى ' ' في بلدي على سبيل المثال تحسين C++ تيارات يجعلها فقط 3x أبطأ من ملف* تيارات (شكرا jalf) قد يكون هناك طرق لجعلها أسرع.

صعوبة استخدام

لا أستطيع القول بأن printf() ليست مقتضب لكنه أكثر مرونة (IMO) و أبسط إلى فهم ، وبمجرد الحصول على الماضي الأولي وتف على الماكرو رموز.

double pi = 3.14285714;

cout << "pi = " << setprecision(5)  << pi << '\n';
printf( "%.5f\n", pi );

cout << "pi = " << fixed << showpos << setprecision(3) << pi << '\n'; 
printf( "%+.3f\n", pi );

cout << "pi = " << scientific << noshowpos << pi<< '\n';
printf( "%e\n", pi );

السؤال

نعم ، قد تكون هناك حاجة إلى أفضل مكتبة C, العديد تكون FastFormat هو أن المكتبة المرة الوحيدة التي سوف اقول.

ديف

نصائح أخرى

والنفي تجاوزات عازلة يبدو وكأنه فوز كبير لC ++ بالنسبة لي.

و

يرجى إلقاء نظرة على

http://www.ddj.com/cpp/184403651

وبعد ذلك سوف تفضل C ++ I / O من C I / O.

و

وفي القصير C ويفضل إذا كنت تعرف حجم البيانات قبل القراءة أو الكتابة والسرعة. ويفضل C ++ إذا كنت لا تعرف حجم البيانات ولرمز فعال.

في الرد على الجواب ديفيد آلان فينش، وأنا ثابت خطأ في التعليمات البرمجية قياس له (انه مسح تيار في رواية C ++ بعد كل سطر واحد)، وreran الاختبار:

ووC ++ حلقة تبدو الآن كما يلي:

start = time(0);
{
    ofstream outdata("example2.txt");
    for( int i = 0; i < max; i++ )
    {
        outdata << teststr << ":" << i << "\n"; // note, \n instead of endl
    }
}
end = time(0);

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

G++ 4.1.2:
C FILE: 4s
C++ Streams: 6s

MSVC9.0:
C FILE: 10s
C++ Streams: 23s

و(لاحظ، تم تشغيل النسخة MSVC على جهاز الكمبيوتر المحمول مع أبطأ بكثير طوة)

ولكن هذا يعطينا الفرق أداء 1.5-2.3x، وهذا يتوقف على التنفيذ. وغيرها من العوامل الخارجية.

أداء الخلافات بين printf()/fwrite نمط I/O و C++ IO تيارات التنسيق كثيرا التنفيذ تعتمد.بعض التطبيقات (visual C++ مثلا) بناء IO تيارات على رأس ملف * الكائنات وهذا يميل إلى زيادة وقت التشغيل تعقيد تنفيذها.ولكن لاحظ أن هناك أي عائق لتنفيذ المكتبة في هذه الموضة.

في رأيي الخاص, فوائد C++ I/O هي كما يلي:

  • نوع السلامة كما ذكر في وقت سابق.
  • المرونة في التنفيذ.رمز يمكن أن تكون مكتوبة للقيام تنسيق معين أو مساهمة أو من عامة ostream أو istream الكائن.التطبيق ثم يمكنك استدعاء هذا القانون مع أي نوع من اشتقاق كائن دفق.إذا كانت التعليمات البرمجية التي كتبت واختبارها ضد الملف الآن يحتاج إلى أن يطبق على مأخذ ، منفذ تسلسلي أو أي نوع آخر من الداخلية تيار يمكنك إنشاء تيار تنفيذ محددة لهذا النوع من I/O.تمديد ج النمط I/O في هذه الموضة ليس حتى على مقربة من الممكن.
  • المرونة في الإعدادات المحلية:ج نهج باستخدام لغة عالمية واحدة ، في رأيي ، معيبة على نحو خطير.لقد شهدت حالات حيث الاحتجاج بها المكتبة البرمجية (DLL) التي غيرت العالمية الإعدادات المحلية تحت قانون بلدي تماما أفسدت الانتاج.C++ تيار يسمح لك أن تصطبغ() أي لغة إلى كائن دفق.

والأمراض المنقولة جنسيا :: ifstream والأمراض المنقولة جنسيا :: ofstream بالفعل في مكتبة المحكمة الخاصة بلبنان. لم يكن لديك لإنشاء الخاصة بك.

والفائدة الرئيسية هي جميع النواتج والمدخلات هي نوع السلامة.

وC و C ++ هي لغتين مختلفتين. C ++ ملف الإعلام والتوعية يأخذ بعض الوقت التعود، ولكن بمجرد أن تستخدم خوارزميات، والاستثناءات وغيرها فإنها تميل إلى الانخفاض في مكانها بشكل طبيعي جدا.

وكلما كنت بحاجة إلى أن تأخذ المدخلات / المخرجات إعطاء في ملف في C ++، أنا فقط استخدام سطرين.

freopen("input.txt","r",stdin); // for input from file
freopen("output.txt","w",stdout);// for output from file

والآن يمكنك مسح متغيرات كما تفعل عادة من وحدة التحكم، ومهما قمت بطباعة كما سيتم عرض الناتج في ملف output.txt.

وهكذا لا أعتقد أن ملف I / O في ج ++ صعبة، لها بدلا أسهل من ج.

والكثير. السلبيات أيضا. انظر التعليمات لغة C ++ لمزيد من التفاصيل. باختصار: نوع السلامة وأنواع المعرفة من قبل المستخدم

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