0

可能重复:
如何在 C 中获取文件的大小?

我在 C 中有一个函数,它正在从文本文件中读取未知数量的行。我正在将行中的数据插入到struct我拥有的数据中。每一行我都在增加结构的大小realloc。一切都很好,但是该函数会返回 thisstruct并且应该插入到struct程序的“main”中。从我的思维方式来看,它不应该起作用,而且它也不起作用。我不知道应该为 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- 常量 - 多边形的点数。

在数组的第一个单元格中 -> rec.[0].poly.points[0].x- 这是我应该保存RECORD数组中实际 s 数量的地方,所以我开始从 [1] 填充它。

基本上我要做的是在 中创建一个,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

我假设不是struct您的意思是struct's 的数组(或您struct持有的行数组),因为我不知道如何在 C 中动态增加结构的大小(编辑:请参阅下面的 WhozCraig 的评论)。

您可以将数组传递给函数并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);
}

您还必须再传递两个指针才能控制数组的容量和它当前拥有的项目数。

附言。C 分配函数不需要显式转换返回值。

于 2013-01-26T12:31:17.817 回答
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 回答