我正在尝试编写一个从文件中读取数据并将其放入struct数组的程序。我已经成功地将它放入数组中但我得到了一个分段错误。我相信我必须使用malloc初始化struct数组,但我是编程新手,并不真正理解如何做到这一点。谢谢你的帮助!我复制了我的代码片段,这样你就可以看到我做了什么。我没有在此代码中包含我的函数。
struct Weather
{
char location;
int daynum;
double temp;
double precip;
};
int main (void)
{
FILE*openFile;
char buffer[COLS][ROWS];
int i = 0;
struct Weather loc1; //initialize here?
for (i = 0; i <200; i++)
{
fgets (buffer[i], ROWS, openFile);
parseLine(buffer[i], &loc1);
printf ("%d %c %d %.2lf %.2lf\n",i, loc1.location, loc1.daynum, loc1.temp, loc1.precip);
}
}
答案 0 :(得分:1)
答案 1 :(得分:1)
在进行任何I / O操作之前,必须使用fopen()
初始化文件流!
int main()
{
char filename[64];
FILE *fp;
snprintf(filename, sizeof(filename), "hello1234.txt");
if(NULL == (fp = fopen(filename, "r")))
{
printf("err, failed when fopen(), %s %s[%d].\n", __FILE__, __FUNCTION__, __LINE__);
return -1;
}
//your code here
return 0;
}
初始化结构
请注意,malloc()
无法初始化结构。
两种方法:
M0:
struct Weather loc1; memset(&amp; loc1,0,sizeof(struct Weather));
M1:
struct Weather loc1 = {0};
man malloc
或点击malloc manual的链接。
答案 2 :(得分:0)
代码中存在多个问题:
流指针openFile
未初始化,调用fgets()
会调用未定义的行为。您要为fopen()
打开文件,或将openFile
的值设置为标准输入流stdin
。
2D char
数组应按其他顺序定义:
char buffer[ROWS][COLS];
你应该对循环计数器和2D数组定义使用相同的常量:ROWS
可能被定义为小于200
的东西。
行缓冲区的大小为COLS
,将其传递给fgets()
。
你应该测试fgets()
的返回值:它在文件末尾返回NULL
,在这种情况下目标数组的内容是不确定的。
是否初始化loc1
取决于parseLine()
函数的作用。 parseLine()
对目标结构的内容没有做出任何假设是有意义的,但是来源尚未发布,所以我们无法确定。
printf
类型的double
格式说明符为%f
,只会忽略额外的l
。