我需要同时使用 malloc
和 realloc
并对如何操作感到困惑。
假设输入文件是这样的。
a *b c
a
*a b *c
而且我把结构设置成了这样
typedef struct Unit {
bool hasAstericks;
char letter;
} unit;
typedef struct Line {
struct unit clause[4]
} line;
是否可以创建一个类型为 unit
将每一个字母加到结构体中的一个数组中。Line
基于它们所在的线?我试过使用循环,但无法在飞行中使用它们创建结构。
这是我试过的。
int c;
filename = argv[1];
char *filename;
FILE *fp = fopen(filename, "r");
filename = (char *)malloc(size);
do {
c = fgetc(fp);
inputFile = (char *)realloc(inputFile, size + 1);
inputFile[n] = c;
n++;
size++;
} while (c != EOF);
您的 do
while
循环试图将文件读入一个由以下内容组成的数组中 char
每从文件中读取一个额外的字节就重新分配一个字节。
然而,你应该测试文件结束时的 之前 将字节存储到数组中。
另外,最好是在数组结束时设置一个null终止符,所以数组应该有一个 size + 1
字节。
这里将你的代码修改并封装在一个函数中读取文件。
char *read_file(const char *filename) {
FILE *fp = fopen(filename, "r");
if (fp == NULL)
return NULL;
size_t size = 0;
char *p = malloc(size + 1);
if (p != NULL) {
int c;
while ((c = getc(fp)) != EOF) {
char *newp = realloc(p, size + 2);
if (newp == NULL) {
free(p);
p = NULL;
break;
}
p = newp;
p[size] = c;
size++;
}
if (p) {
p[size] = '\0'; set a null terminator: make p a C string.
}
}
fclose(fp);
return p;
}