我遇到一个问题,我必须从指针数组中的文件中读取未知数量的文本行,并在运行时分配内存。
#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;
}
答案 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状态仅在您尝试阅读之后设置,而不是之前。