我想创建一个逐行读取文件的函数。每一行都有一个名字。
int readConfig(char ** path, FILES ** files )
{
FILE* f;
f = fopen("file", "r");
int ch;
while ((ch=fgetc(f)) != EOF )
{
}
return 0;
}
如何使用fgetc函数解析文件?以及如何将结果传递给文件[count] .name?
答案 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。我不确定应该在filename
和name
个变量中存储什么。如果按行:
strcpy(files[count].filename,'.bin');
你的意思是添加一个' .bin'到filename变量,那么这种方法是错误的。您应该使用strcat
。 strcpy
将从此变量的开头写入文件名,因此之前保存在那里的一些字符将被覆盖。 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
这应该让你更清楚一下崩溃的起因是什么。您还应该考虑使用fgets或getline。请记住free
您所拥有的malloc
&#39; d。
编辑:
调用readConfig(&path, &files);
会导致传递给readConfig类型为FILES (*)[256]
的指针。考虑将FILES files[256];
更改为
FILES* files = malloc(sizeof(FILES)*256);
稍后将您的功能称为readConfig(&path, files);
然后,您将传递给readConfig函数兼容类型的files
。