如何读取文件行并将它们转换为C中的数组?

时间:2014-09-10 20:26:32

标签: c fgetc

我想创建一个逐行读取文件的函数。每一行都有一个名字。

int readConfig(char ** path, FILES ** files )
{
    FILE* f;
    f = fopen("file", "r");   
    int ch;
    while ((ch=fgetc(f)) != EOF )
    {

    }
return 0;
}

如何使用fgetc函数解析文件?以及如何将结果传递给文件[count] .name?

2 个答案:

答案 0 :(得分:3)

马上开球:

char configFile [11] = "kernels.cfg";

[11]太小了。尝试:

char configFile [12] = "kernels.cfg";

char configFile [] = "kernels.cfg";          /* let the compiler do the counting */

char也太小了,无法使用:

int ch;

您可能还会发现fgets() - 它在某个时间读取整行 - 比fgetc()更易于使用。

答案 1 :(得分:2)

由于修改字符串文字并导致undefined behavior(例如您的SIGSEGV),您将获得SIGSEGV。我不确定应该在filenamename个变量中存储什么。如果按行:

strcpy(files[count].filename,'.bin');

你的意思是添加一个' .bin'到filename变量,那么这种方法是错误的。您应该使用strcatstrcpy将从此变量的开头写入文件名,因此之前保存在那里的一些字符将被覆盖。 strcpy还添加了一个空终止字符,因此如果您想将其打印出来,printf将停在\0个字符上,并且不会再进一步​​。但是,真正的问题是你应该在struct中为你的变量分配malloc一些空间。然后你就可以修改它们了。

考虑简单的例子:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct file {
    char* name;
    char* filename;
};

int main(void)
{
    struct file x;
    x.name = malloc(30);
    x.filename = malloc(40);

    strncpy(x.name, "copied_string", 13);
    printf("%s\n", x.name);

    strcat(x.name, "_suffix"); 
    printf("%s\n", x.name);

    strcpy(x.name, "erased");
    printf("%s\n", x.name);

    free(x.name);
    free(x.filename);
    return 0;
}

输出:

copied_string
copied_string_suffix
erased

这应该让你更清楚一下崩溃的起因是什么。您还应该考虑使用fgetsgetline。请记住free您所拥有的malloc&#39; d。

编辑:

调用readConfig(&path, &files);会导致传递给readConfig类型为FILES (*)[256]的指针。考虑将FILES files[256];更改为

FILES* files = malloc(sizeof(FILES)*256);

稍后将您的功能称为readConfig(&path, files);

然后,您将传递给readConfig函数兼容类型的files