سؤال

أنا طباعة متغير يقول Z1 وهو صفيف 1-D يحتوي على أرقام نقاط عائمة إلى ملف نصي حتى أتمكن من الاستيراد إلى MATLAB أو GNUPLOT للتخطيط. لقد سمعت أن الملفات الثنائية (.DAT) أصغر من ملفات .txt. التعريف الذي أستخدمه حاليًا للطباعة على ملف .txt هو:

void create_out_file(const char *file_name, const long double *z1, size_t z_size){
FILE *out;
size_t i;
 if((out = _fsopen(file_name, "w+", _SH_DENYWR)) == NULL){
 fprintf(stderr, "***> Open error on output file %s", file_name);
 exit(-1);
 }
for(i = 0; i < z_size; i++)
fprintf(out, "%.16Le\n", z1[i]);
fclose(out);
}   

لدي ثلاثة أسئلة:

  1. هل الملفات الثنائية أكثر إحكاما من الملفات النصية؟

  2. إذا كانت الإجابة بنعم ، أود أن أعرف كيفية تعديل الكود أعلاه حتى أتمكن من طباعة قيم الصفيف Z1 إلى ملف ثنائي. لقد قرأت أن fprintf يجب استبداله بالكتب. يقول ملف الإخراج الخاص بي DODO.DAT يجب أن يحتوي على قيم Array Z1 برقم عائم واحد لكل سطر.

  3. لدي ٪ .16LE في الكود الخاص بي ، لكنني أعتقد أن ٪ .15LE على حق لأن لدي 15 رقمًا دقيقًا مع مزدوج طويل. لقد وضعت نقطة (.) في وضع العرض لأنني أعتقد أن هذا يسمح بالتوسع في مجال تعسفي للاحتفاظ بالرقم المطلوب. هل انا على حق؟ على سبيل المثال مع ٪ .16LE ، يمكنني الحصول على إخراج مثل 1.0047914240730432E-002 والذي يعطيني 16 رقمًا دقيقًا وعرض الحقل له العرض الصحيح لعرض الرقم بشكل صحيح. هل وضع نقطة (.) في وضع العرض بدلاً من قيمة العرض ممارسة جيدة؟

شكرًا جزيلاً...

تحديث يتغير إلى:

for(i = 0; i < z_size; i++)
fwrite(&z1, sizeof(long double), 1, out);

حسنًا ، بالإضافة إلى التغيير إلى "WB+"؟ لا يمكنني قراءة الملف الثنائي في MATLAB.

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

المحلول

  1. نعم ، الملفات الثنائية أكثر إحكاما ، لكنك تفقد قابلية الحمل وهناك العديد من المشكلات المحتملة الأخرى أيضًا ، لذلك ما لم تكن ملفات البيانات الخاصة بك ضخمة بشكل كبير ، أو بطيئة في التصدير/الاستيراد ، من الجيد التمسك بالنص إذا استطعت ( يمكن دائمًا ضغطها للتخزين ، على سبيل المثال مع الرمز البريدي)

  2. افتح ملفك بـ "WB" بدلاً من "W" واستخدم fwrite() - لم يعد لديك "خطوط" في ملفك - سيكون مجرد دفق من قيم النقطة العائمة (الثنائية)

  3. قد تشعر بالارتباك بين double و long double - أ long double يمكن أن يصل حجم ما يصل إلى 16 بايت ولديه دقة تصل إلى حوالي 32 رقمًا (ومع ذلك ، فإن هذا يعتمد على التنفيذ - يمكن عادةً أن يكون عمره مزدوجًا طويلًا 10 أو 12 أو 16 بايت). أ double عادة ما يكون 8 بايت ولديه دقة حوالي 16 رقمًا.

قد لا يكون Matlab قادرًا على التغلب عليه long double (نظرًا لأنه ليس موحدًا جيدًا) ، فربما تريد فقط كتابة الزوجي إلى ملف البيانات الخاص بك ، على سبيل المثال

for (i = 0; i < z_size; i++)
{
    double z = (double)z1[i];
    fwrite(&z, sizeof(double), 1, out);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top