Dev c++中第二次运行程序提示“Program received signal SIGSEGV,Segmentation fault.”是什么原因,求指导。

longquan0315 2017-05-22 12:58:29
用Dev c++编译无错误,运行第一次也正常,从第二次运行开始提示“Program received signal SIGSEGV,Segmentation fault.”是什么原因,求指导。代码如下:

#include <stdio.h>
#include <time.h>

char fname[128] = "dt.dat";

void get_date(void)
{
struct tm date;
FILE *fp;

if((fp = fopen(fname,"r")) == NULL)
puts("第一次运行该程序。");
else{
int i;
i = fread(&date,sizeof(struct tm),9,fp);
printf("%d\n",i);

printf("上次运行是在%d年%d月%d日%d时%d分%d秒。\n",
date.tm_year + 1900,date.tm_mon + 1,date.tm_mday,
date.tm_hour,date.tm_min,date.tm_sec);
fclose(fp);
}
}

void put_date(void)
{
FILE *fp;
time_t t;
struct tm *local;

time(&t);
local = localtime(&t);

if((fp = fopen(fname,"w")) == NULL)
puts("\afile open failed.");
else{
fwrite(local,sizeof(struct tm),9,fp);
fclose(fp);
}
}

int main(void)
{
get_date();

put_date();

return (0);
}
...全文
825 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ckc 2017-05-22
  • 打赏
  • 举报
回复
fread(&date,sizeof(struct tm),9,fp); 这一句读了9个tm出来,而date只能保存1份数据, 所以把后面的变量都搞乱了,fp数据被改写,所以fclose的时候就出错了
longquan0315 2017-05-22
  • 打赏
  • 举报
回复
引用 5 楼 cfjtaishan 的回复:
可以这样理解,但是,struct tm成员都得是int类型(占四个字节)才可以。这样做有一个缺点,就是如果struct tm添加或者减少一个成员或者某个成员的类型变了,比如编程char,或者double,那么还是有问题。 所以,建议写成这样形式:
fwrite(local,sizeof(struct tm),1,fp);
fread(&date,sizeof(struct tm),1,fp);
除了安全以外,也能提高程序的可移植性。
明白了,谢谢!
自信男孩 2017-05-22
  • 打赏
  • 举报
回复
引用 4 楼 longquan0315 的回复:
[quote=引用 2 楼 cfjtaishan 的回复:]
fwrite(local,sizeof(struct tm),1,fp);
不清楚楼主为什么要传fwrite第三个参数为9,根据你的需要,一个就可以了。
i = fread(&date,sizeof(struct tm),1,fp);
感谢楼上两位的回答,我像下面这样理解对吗? struct tm中有9个int型数据,在fread和fwrite两个函数的参数中,如果第二个参数是sizeof(int)的话,第三个参数就应该是9。
fwrite(local,sizeof(int),1,fp);
fread(&date,sizeof(int),1,fp);
如果第二个参数是sizeof(struct tm)的话,第三个参数就应该是1
fwrite(local,sizeof(struct tm),1,fp);
fread(&date,sizeof(struct tm),1,fp);
这样对吗?[/quote] 可以这样理解,但是,struct tm成员都得是int类型(占四个字节)才可以。这样做有一个缺点,就是如果struct tm添加或者减少一个成员或者某个成员的类型变了,比如编程char,或者double,那么还是有问题。 所以,建议写成这样形式:
fwrite(local,sizeof(struct tm),1,fp);
fread(&date,sizeof(struct tm),1,fp);
除了安全以外,也能提高程序的可移植性。
longquan0315 2017-05-22
  • 打赏
  • 举报
回复
引用 2 楼 cfjtaishan 的回复:
fwrite(local,sizeof(struct tm),1,fp);
不清楚楼主为什么要传fwrite第三个参数为9,根据你的需要,一个就可以了。
i = fread(&date,sizeof(struct tm),1,fp);
感谢楼上两位的回答,我像下面这样理解对吗? struct tm中有9个int型数据,在fread和fwrite两个函数的参数中,如果第二个参数是sizeof(int)的话,第三个参数就应该是9。
fwrite(local,sizeof(int),1,fp);
fread(&date,sizeof(int),1,fp);
如果第二个参数是sizeof(struct tm)的话,第三个参数就应该是1
fwrite(local,sizeof(struct tm),1,fp);
fread(&date,sizeof(struct tm),1,fp);
这样对吗?
longquan0315 2017-05-22
  • 打赏
  • 举报
回复
引用 1 楼 ckc 的回复:
fread(&date,sizeof(struct tm),9,fp); 这一句读了9个tm出来,而date只能保存1份数据, 所以把后面的变量都搞乱了,fp数据被改写,所以fclose的时候就出错了
感谢楼上两位的回答,我像下面这样理解对吗? struct tm中有9个int型数据,在fread和fwrite两个函数的参数中,如果第二个参数是sizeof(int)的话,第三个参数就应该是9。
fwrite(local,sizeof(int),1,fp);
fread(&date,sizeof(int),1,fp);
如果第二个参数是sizeof(struct tm)的话,第三个参数就应该是1
fwrite(local,sizeof(struct tm),1,fp);
fread(&date,sizeof(struct tm),1,fp);
这样对吗?
自信男孩 2017-05-22
  • 打赏
  • 举报
回复
fwrite(local,sizeof(struct tm),1,fp);
不清楚楼主为什么要传fwrite第三个参数为9,根据你的需要,一个就可以了。
i = fread(&date,sizeof(struct tm),1,fp);

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧