-1

我想创建一个函数来逐行读取文件。每一行是一个名字。

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

    }
return 0;
}

如何使用 fgetc 函数解析文件?以及如何将结果获取到 files[count].name?

4

2 回答 2

3

马上开始:

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

[11] 太小了。尝试:

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

或者

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

char 对于 ch 来说也太小了——使用:

int ch;

您可能还会发现fgets()- 一次读取一整行 - 使用起来比fgetc().

于 2014-09-10T20:29:40.607 回答
2

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

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

你的意思是在文件名变量中添加一个“.bin”,那么这种方法是错误的。你应该使用strcat. strcpy将从该变量的开头写入文件名,因此以前保存在那里的一些字符将被覆盖。strcpy还添加了一个空终止字符,因此如果您想将其打印出来, printf 将在该\0字符上停止并且不会进一步。然而,真正的问题是你应该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的。

编辑:

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

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

然后调用你的函数readConfig(&path, files);

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

于 2014-09-11T11:12:26.107 回答