免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5224 | 回复: 12
打印 上一主题 下一主题

[C] ubuntu 用C语言的libxls接口处理.xls文件时出现段错误 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-02-10 12:59 |只看该作者 |倒序浏览
ubuntu13.10的系统,刚刚下载安装了libxls 1.4.0接口,就写了一个简单的程序实验一下,
源代码:
#include<stdio.h>
#include<xls.h>

int main(int argc,char **argv)
{

FILE *fout;
xlsWorkBook *pWb;
xlsWorkSheet *pWs;
struct st_row_data *row;
int i,j;
if((fout=fopen("1.txt","w"))==NULL){
fprintf(stderr,"Error: open file failed!\n");
return -1;
};
if((pWb=xls_open("2.xls","UTF-8"))==NULL){
fprintf(stderr,"Error: open workbook error!\n");
return -1;
};
if((pWs=xls_getWorkSheet(pWb,0))==NULL){
fprintf(stderr,"Error: open worksheet error!\n");
return -1;
};
xls_parseWorkSheet(pWs);
for(i=0;i<8;i++){
row=&pWs->rows.row;
for(j=0;j<7;j++){
fprintf(fout,"%s\t",row->cells.cell[j].str);
}
fputc('\n',fout);
}
xls_close_WS(pWs);
xls_close_WB(pWb);
fclose(fout);
return 0;

}
运行提示段错误,用gdb调试:
把断点定在fopen前:

这样看好像是fopen有问题,但是写一个只有fopen和fclose的程序测试没问题。
把断点定在fclose前:

和刚才提示不一样。。
如果断点定在第一行一直next单步执行又可以一直运行没有错误。
我晕了,不知道哪里出了问题,求大神帮助~~~

论坛徽章:
0
2 [报告]
发表于 2014-02-10 12:59 |只看该作者
不知道这个帖子是不是发错版块了。。。

论坛徽章:
0
3 [报告]
发表于 2014-02-10 13:01 |只看该作者
抱歉,图没发上,在附件里

捕获.JPG (14.26 KB, 下载次数: 68)

第二张图

第二张图

捕获1.JPG (17.93 KB, 下载次数: 65)

第一张图

第一张图

论坛徽章:
0
4 [报告]
发表于 2014-02-10 13:24 |只看该作者
帮顶                           

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
5 [报告]
发表于 2014-02-10 15:54 |只看该作者
1. 崩溃的时候调用堆栈贴出来。
2. ldd的输出也贴出来。

论坛徽章:
0
6 [报告]
发表于 2014-02-10 16:41 |只看该作者
是这个意思么,我是新手,不太懂。


回复 5# gaojl0728


   

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
7 [报告]
发表于 2014-02-10 16:47 |只看该作者
第35行是最后一行return 0吗?

你还是编译一个debug 版吧,要不然调用堆栈被优化过可能乱了, 编译的时候加上-g选项
把debug版崩溃的时候调用堆栈发过来就可以了。

论坛徽章:
0
8 [报告]
发表于 2014-02-10 16:50 |只看该作者
这种很莫名的错误通常都会把代码规范一下,该初始化初始化,该嘛嘛!

论坛徽章:
0
9 [报告]
发表于 2014-02-10 16:59 |只看该作者
回复 7# gaojl0728
35行是fprintf(fout,"%s\t",row->cells.cell[j].str);
debug版是不是就是gcc用-g?刚才那个就是这样编译的。
刚刚我又把fprintf换成printf发现能输出一些东西了,但是输出完还是段错误,这是什么情况?

   

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
10 [报告]
发表于 2014-02-10 17:17 |只看该作者
看你的调用堆栈有很多<optimized out>像是优化过的,先不管了。

按你说的是在fprintf(fout,"%s\t",row->cells.cell[j].str)这行挂了。
那很可能你的for循环写的有问题,越界了。
for(j=0;j<7;j++){
        fprintf(fout,"%s\t",row->cells.cell[j].str);
}
你的7是从哪里来的?很可能是row->cells.cell这个数组长度小于7,结果你在遍历的时候就越界了被内核发送SIGSEGV干掉了。
你可以把7改小点比如1,应该就不会挂了。

另外你外部的循环定义的 i 变量都没有使用,你是不是拷贝代码没考全啊,你再好好参考下人家的例子吧。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP