我想创建一个函数来逐行读取文件。每一行是一个名字。
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?
马上开始:
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()
.
由于修改字符串文字并导致未定义的行为(例如您的 SIGSEGV),您将获得 SIGSEGV。我不确定应该存储什么filename
和name
变量。如果按行:
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
这应该可以更清楚地说明崩溃的根源是什么。您还应该考虑使用fgets或getline。记住free
你所做malloc
的。
编辑:
调用readConfig(&path, &files);
导致将一个类型的指针传递给 readConfig FILES (*)[256]
。考虑FILES files[256];
改为
FILES* files = malloc(sizeof(FILES)*256);
然后调用你的函数readConfig(&path, files);
然后,您将向 readConfig 函数传递兼容类型的files
.