我需要在文件中读取。文件的第一行是文件中的行数,它返回一个字符串数组,最后一个元素是NULL,表示数组的结束。
char **read_file(char *fname)
{
char **dict;
printf("Reading %sn", 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("Donen");
return dict;
}
我放了一些注释,因为我知道这是我要做的,但我似乎不知道如何把它放在实际的代码中。
要解决这个问题,你需要做两件事中的一件。
- 以字符形式读取文件,然后转换为整数。
- 直接以整数形式读取文件
首先,使用free转换为字符数组,然后使用atoi转换为整数。
对于第二个,您将使用fscanf并使用指定的%d直接读入int变量;
fscanf不为您分配内存。给它传递一个随机指针只会带来麻烦。(我建议避免使用fscanf)。
问题码有一个缺陷:
char *size;
fscanf(d, "%s[^n]", size);
虽然上面的代码可以编译,但在运行时它不会像预期的那样工作。问题是fscanf()需要写入解析值的内存地址。虽然size
是一个可以存储内存地址的指针,但它是未初始化的,并且在进程的内存映射中没有指向特定的内存。
下面可能是更好的替代:
fscanf(d, " %d%*c", &filesize);
查看我的剧透代码版本在这里