是否可以从文件中获取令牌并使用 C 中的 malloc 创建结构?
Is it possible to take a token from a file and create a struct with it using malloc in C?
我需要同时使用 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
数组,您为从文件中读取的每个额外字节重新分配该数组。
然而,您应该在将字节存储到数组中之前测试文件结束。
完成后最好在数组末尾设置一个空终止符,这样数组应该有 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] = '[=10=]'; set a null terminator: make p a C string.
}
}
fclose(fp);
return p;
}
我需要同时使用 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
数组,您为从文件中读取的每个额外字节重新分配该数组。
然而,您应该在将字节存储到数组中之前测试文件结束。
完成后最好在数组末尾设置一个空终止符,这样数组应该有 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] = '[=10=]'; set a null terminator: make p a C string.
}
}
fclose(fp);
return p;
}