我需要读一个文件。该文件的第一行是文件中的行数,它返回一个字符串数组,最后一个元素为NULL,表示数组的结束。
char **read_file(char *fname)
{
char **dict;
printf("Reading %s\n", fname);
FILE *d = fopen(fname, "r");
if (! d) return NULL;
// Get the number of lines in the file
//the first line in the file is the number of lines, so I have to get 0th element
char *size;
fscanf(d, "%s[^\n]", size);
int filesize = atoi(size);
// Allocate memory for the array of character pointers
dict = NULL; // Change this
// Read in the rest of the file, allocting memory for each string
// as we go.
// NULL termination. Last entry in the array should be NULL.
printf("Done\n");
return dict;
}
我发表了一些评论,因为我知道这就是我要做的事情,但我似乎无法弄清楚如何将它放在实际的代码中。
答案 0 :(得分:0)
要解决此问题,您需要执行以下两项操作之一。
对于第一个,您将使用释放到char数组,然后使用atoi转换为整数。
对于第二个,您将使用fscanf并使用%d指定直接读入int变量;
fscanf不为您分配内存。如果你传递一个随机指针只会造成麻烦。 (我建议避免使用fscanf)。
答案 1 :(得分:0)
问题代码有一个缺陷:
char *size;
fscanf(d, "%s[^\n]", size);
虽然上面可能会编译,但它在运行时不会按预期运行。问题是fscanf()需要写入解析值的内存地址。虽然size
是一个可以存储内存地址的指针,但它是未初始化的,并指向进程内存映射中没有特定的内存。
以下可能是更好的替代品:
fscanf(d, " %d%*c", &filesize);
查看我的扰流器代码版本here