سؤال

كيف يمكنني fwrite من الهيكل الذي يحتوي على صفيف

#include <iostream>
#include <cstdio>

typedef struct {
  int ref; 
  double* ary;
} refAry;

void fillit(double *a,int len){
  for (int i=0;i<len;i++) a[i]=i;
}

int main(){
  refAry a;
  a.ref =10;
  a.ary = new double[10];
  fillit(a.ary,10);
  FILE *of;
  if(NULL==(of=fopen("test.bin","w")))
     perror("Error opening file");
  fwrite(&a,sizeof(refAry),1,of);

  fclose(of);
  return 0;
}

ملفات test.bin هو 16 بايت، والتي أعتقد أنها (4 + 8) (int + double *). يجب أن تكون الملفات 4 + 10 * 8 (IM على 64 بت)

~$ cat test.bin |wc -c
16
~$ od -I test.bin 
0000000                   10             29425680
0000020
~$ od -fD test.bin -j4
0000004   0,000000e+00   7,089709e-38   0,000000e+00
                     0       29425680              0
0000020

شكرا

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

المحلول

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

void write_my_struct(FILE * pf, refAry * x)
{
    fwrite(&x->ref, sizeof(x->ref), 1, pf);
    fwrite(x->ary, sizeof(x->ary[0]), x->ref, pf);
}

ستحتاج إلى بديل مماثل للزاحة.

نصائح أخرى

لا تحتوي هيكلك في الواقع على صفيف، فهو يحتوي على مؤشر. إذا كنت تريد حقا هياكل متغيرة الطول، فستحتاج إلى الحفاظ على حقل الحجم هناك حتى تعرف كم هو كبير. ال ج التعليمات لديه مثال على ما يبدو أنك تحاول القيام به. في حالتك قد تبدو مثل هذا:

typedef struct {
    int ref; 
    double ary[1];
} refAry;

#define SIZE_OF_REFARY (sizeof(refAry) - sizeof(double))

تخصيص:

size_t alloc_size = SIZE_OF_REFARY + 10*sizeof(double);
refAry *a = malloc(alloc_size);
a->ref = 10;

لأكتب:

fwrite(a, SIZEP_OF-REFARY + a->ref * sizeof(double), 1, file);

يحتوي هيكلك على مؤشر، وليس صفيفا من 10. يختار Sizeof () ذلك.

ستحتاج إلى شيء مثل FWWRITE (A.ARY، Sizeof (Double)، 10، من)؛ من أجل كتابة الصفيف الفعلي

إذا كان حجم الصفيف هو دائما 10، فقم ببساطة تغيير بنية الخاص بك إلى:

typedef struct {
  int ref; 
  double ary[10];
} refAry;

يمكنك بعد ذلك كتابة هذا مع مكالمة واحدة إلى FWWRITE، باستخدام SizeOf (ترفع) للحجم.

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