运行时的内存

时间:2016-01-09 14:17:49

标签: c pointers

我遇到一个问题,我必须从指针数组中的文件中读取未知数量的文本行,并在运行时分配内存。

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

int main()
{
    FILE *fp = fopen("file.txt","r");
    char *arrp[10];
    int i=1;

    while(!feof(fp))
    {
        arrp[i]=malloc(sizeof(char)*51);
        fgets(arrp[i],51,fp);
        i++;
    }

    return 0;
}

2 个答案:

答案 0 :(得分:2)

我建议先计算行数。

int tmp;
int linecount = 0;
FILE *fp = fopen("file.txt","r");

while ((tmp=fgetc(fp))!=EOF) {
    if (tmp=='\n') 
         ++linecount;
}

rewind(fp); // resets the stream to beginning of file

从那里,你可以malloc适当数量的数组指针(而不是初始化固定数字)。

 char** lines;
 lines = malloc(linecount * sizeof(char*));

并正常使用fgets然后将每行读入行[i]

答案 1 :(得分:0)

首先,您需要编写一个getline例程,该例程读入一个可变长度的行。它将分配malloc

#define INITALLOC  16  /* #chars initally alloced */
#define STEP        8  /* #chars to realloc by */
int getline(char **dynline)
{
    int i, c;
    size_t nalloced;  /* #chars currently alloced */

    if ((*dynline = malloc(INITALLOC)) == NULL)
        return 0;
    nalloced = INITALLOC;
    for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i) {
        /* buffer is full, request more mem */
        if (i == nalloced)
            if ((*dynline = realloc(*dynline, nalloced += STEP)) == NULL)
                return 0;
        /* store the newly read character */
        (*dynline)[i] = c;
    }
    /* zero terminate the string */
    (*dynline)[i] = '\0';

    if (c == EOF)
        return 0;  /* return 0 on EOF */
    return 1;
}

此函数在失败或EOF时返回0,在成功时返回1。现在我们可以阅读main函数中的行。

int main()
{
    char *line;

    while (getline(&line))
        printf("%s\n", line);

    /* free to avoid mem leak */
    free(line);
    return 0;
}

并且不要使用while(!feof(fp)),因为这总是会导致一次额外的读取,因为EOF状态仅在您尝试阅读之后设置,而不是之前。