如何从C中读取文件中的行?

时间:2014-05-22 16:43:42

标签: c file null malloc fopen

我需要读一个文件。该文件的第一行是文件中的行数,它返回一个字符串数组,最后一个元素为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;
}

我发表了一些评论,因为我知道这就是我要做的事情,但我似乎无法弄清楚如何将它放在实际的代码中。

2 个答案:

答案 0 :(得分:0)

要解决此问题,您需要执行以下两项操作之一。

  1. 将文件作为字符读取,然后转换为整数。
  2. 直接以整数形式读取文件。
  3. 对于第一个,您将使用释放到char数组,然后使用atoi转换为整数。

    对于第二个,您将使用fscanf并使用%d指定直接读入int变量;

    fscanf不为您分配内存。如果你传递一个随机指针只会造成麻烦。 (我建议避免使用fscanf)。

答案 1 :(得分:0)

问题代码有一个缺陷:

char *size;
fscanf(d, "%s[^\n]", size);

虽然上面可能会编译,但它在运行时不会按预期运行。问题是fscanf()需要写入解析值的内存地址。虽然size是一个可以存储内存地址的指针,但它是未初始化的,并指向进程内存映射中没有特定的内存。

以下可能是更好的替代品:

fscanf(d, " %d%*c", &filesize);

查看我的扰流器代码版本here