0

重複の可能性:
C でファイルのサイズを取得するにはどうすればよいですか?

テキスト ファイルから不明な数の行を読み取る C の関数があります。私は行からstruct私が持っているにデータを挿入しています。各行で、構造体のサイズを増やしていreallocます。すべて問題ありませんが、関数はこれを返し、プログラムのstruct「メイン」structに挿入する必要があります。私の考え方では、うまくいかないはずですし、うまくいきません。main にどのくらいのスペースを割り当てる必要があるのか​​ わかりません。structそれから、より大きな を比較しようとしていstructます。

コードは非常に長いですが、これは私が基本的に行っていることです:

int* blah()
{
    int *x;
    x=(int*)malloc(sizeof(int)*3);
    x[0]=1;
    x[1]=2;
    x[3]=3;
    return x;
}

int main()
{
    int *y, *z;
    y=(int*)malloc(sizeof(int)*1);
    z=y;
    z = blah();
 return 0;
}

をどれだけ増やすべきかをどうやって知ることができyますか?

ps malloc10 を実行していて、ファイルに 5 行ある場合、(予想どおり) 動作しています。

ありがとう

編集: 私が構築しているこのプログラムは学校向けであり、読み取り関数のプロトタイプが与えられ、構造体を返し、ファイルへのポインターを取得するだけです。そのため、これ以上変数を送信できません。

編集 2: 構造体:

typedef struct
{
    int x;
    int y;
}POINT;

typedef struct
{
    POINT points[SHAPE_TYPE];
}POLIGON;

typedef struct
{
    POLIGON poly;
    float sides[SHAPE_TYPE];
}RECORD;

読み取り機能:

RECORD* Read(FILE* F)
{
    RECORD* rec;
    int i=1,j;

    rec = (RECORD*)malloc(PACK*sizeof(RECORD));

        if (rec == NULL) 
        {
                   exit(1); 
        }

    rec[0].poly.points[0].x=0;

    if(F == NULL)
    {
         printf("Could not open a file for reading. Exiting....\n");
         exit(1);
    }


         while (!feof(F))
         {
             if(rec[0].poly.points[0].x==(sizeof(*rec)/sizeof(RECORD)-1))
                rec = (RECORD*)realloc(rec,((sizeof(*rec)/sizeof(RECORD))+PACK)*sizeof(RECORD));

                if (rec == NULL) {
                   exit(1); 
                }

             for(j=0; j<SHAPE_TYPE; j++)
                fscanf(F, "%d,%d,%f,",&rec[i].poly.points[j].x,&rec[i].poly.points[j].y,&rec[i].sides[j]);

             fscanf(F,"\n");

             rec[0].poly.points[0].x=i;

             i++;
         }

      fclose(F);

         return rec;

}

私はそれを次のように呼びます:

RECORD* rec,p;
FILE *f;

rec = (RECORD*)malloc(PACK*sizeof(RECORD));

p=rec;

f=NULL;
f = fopen("Save.txt", "r");

p = Read(f);

グローバル変数が使えません。 PACK-定数番号。この数で配列を増やす必要があります。 SHAPE_TYPE- Const - ポリゴンが持つポイントの数。

配列の最初のセル -> rec.[0].poly.points[0].x- これは、配列内の実際の s の数を保存する場所RECORDなので、[1] から入力し始めます。

基本的に私がやろうとしているのは、に of を作成し、別arrayの未知のサイズの配列を作成して(array)のポインターを返す関数を使用してファイルから読み取ることです。RECORDmain()RECORD

簡単な方法は、ポインター配列をメインから関数に送信し、何も返さない (void) ことですが、このプロトタイプを使用することを余儀なくされました。

4

3 に答える 3

0

まあ、それは何かでしたrealloc

すべてのコードが正しく記述されているかどうかはわかりませんが、次のように変更reallocします。

        if(((*REC)[0].poly.points[0].x+1) % PACK==0)
        {
            p = (RECORD*)realloc(p,((*REC)[0].poly.points[0].x+1+PACK)*sizeof(RECORD));

                if (p == NULL) 
                {
                   exit(1); 
                }
        }

そして今、それは機能しています。

于 2013-01-26T17:54:15.397 に答える
0

「古いz」を関数に渡してから、「realloc」を使用する必要があります。拡張するサイズがわかるように、「現在のカウント」も必要になります。

int* blah(int *old, int* count)
{
    int *x;
    *count += 3;     // add three to count, as we are adding three elemnts
    x=realloc(old, sizeof(int)*count);
    if (!x) {
        free(old);   // Prevent leaking the "old" pointer. 
        allocation_failed();   // Do something if this goes wrong!
    }
    x[count-3]=1;
    x[count-2]=2;
    x[count-1]=3;
    return x;
}

int main()
{
    int *z = NULL;   // initialize z to NULL so we can start from "empty".
    int i;
    int count = 0; 
    z = blah(z, &count);
    z = blah(z, &count);
    for(i = 0; i < count; i++)
      printf("%d\n", z[i]);
 return 0;
}

ご覧のとおり、へのポインタを渡しています。これによりcount、への呼び出しごとにカウントを更新できますblah

この問題を解決できる方法は他にもたくさんあります。

于 2013-01-26T12:33:00.297 に答える
0

Cで構造体のサイズを動的に増やす方法がわからないので、代わりにの配列(または行の配列を保持する)structを意味すると思います(編集:以下のWhozCraigのコメントを参照)。structstruct

配列を関数に渡し、realloc必要に応じて ( を使用して)拡張することができます。

#include <stdio.h>
#include <stdlib.h>

int *blah(int *arr, size_t *elem_count, size_t *max_size)
{
    int i;

    for(i = 1; i <= 3; ++i)
    {
        if((*elem_count) == (*max_size)) /* max capacity exceeded */
        {
            int *tmp;
            ++(*max_size);
            tmp = realloc(arr, *max_size * sizeof *arr);
            if(tmp == NULL)
            {
                ;               /* Error handling and cleanup */
            }
            arr = tmp;
        }
        arr[(*elem_count)++] = i;
    }
    return arr;
}

int main(void)
{
    int *arr = NULL;
    size_t count = 0, size = 0, i;
    /* You may also pass an allocated array to `blah' */
    arr = blah(arr, &count, &size);
    if(arr == NULL)
    {
        ;                       /* Error handling and cleanup */
    }

    for(i = 0; i < count; ++i)
        printf("%d\n", arr[i]);

    free(arr);

    exit(EXIT_SUCCESS);
}

また、配列の容量と現在保持しているアイテムの数を制御できるようにするには、さらに 2 つのポインターを渡す必要があります。

PS。C 割り当て関数は、戻り値の明示的なキャストを必要としません。

于 2013-01-26T12:31:17.817 に答える