fgets() segmentation fault 断错误问题

为天下苍生拔剑 2012-01-16 10:49:48
代码:
#include "cv.h"
#include "highgui.h"
#include <sys/time.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
char *getstimeval(char *buf)
{
struct timeval tv;
struct tm tm;
size_t len = 28;

gettimeofday(&tv, NULL);
localtime_r(&tv.tv_sec, &tm);
strftime(buf, len, "%Y-%m-%d %H:%M:%S", &tm);
len = strlen(buf);
sprintf(buf + len, ".%6.6d", (int)(tv.tv_usec));

return buf;
}

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

char x[11],y[11];
char image_name[30];

FILE *fd;
fd=fopen("hello.txt","r");

if(NULL==fd)
{
printf("read file error!");
return 0;
}
printf("read file success!\n");

while((fgets(x,11,fd))!=NULL)
{
printf("%s",x);
}
fseek(fd,0L,0);

while((fgets(y,11,fd))!=NULL)
{
printf("%s",y);
}
fseek(fd,0L,0);
printf("%s",x);
printf("%s",y);
IplImage* frame;
CvCapture* capture;
capture=cvCreateCameraCapture(0);

while(1)
{
frame=cvQueryFrame(capture);
if(strcmp(x,y)!=0)
{
char buf[28];
struct timeval tv1;
gettimeofday(&tv1, NULL);
sprintf(image_name,"%s%s",getstimeval(buf),".jpg");
cvSaveImage(image_name,frame);
printf("change\n");

}
if(!frame) break;

fgets(x,11,fd);
printf("%s",x);
fseek(fd,0L,0);

char c=cvWaitKey(100);
fd=fopen("hello.txt","r");
if (c==27) break;


fgets(y,11,fd);
printf("%s",y);
fseek(fd,0L,0);

}
cvReleaseImage(&frame);
cvReleaseCapture(&capture);
fclose(fd);
}

编译通过,程序要不停的运行,运行一段时间之后出现段错误。gdb了一下是fets()的问题。但是楼主不是很明白gdb,不会用。编译环境ubuntu 10.04,求指正。
...全文
611 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 mscf 的回复:]

循环中使用完就关闭fd~
[/Quote]循环中加入fclos(fd); 编译通过,运行一堆错误。
glibc detected *** ./final: malloc(): memory corruption: 0x00007f5fa7483010 ***
======= Backtrace: =========
/lib/libc.so.6(+0x775b6)[0x7f5fb6e3c5b6]
/lib/libc.so.6(+0x7b6d8)[0x7f5fb6e406d8]
/lib/libc.so.6(__libc_malloc+0x6e)[0x7f5fb6e4158e]
/lib/libc.so.6(+0x684cb)[0x7f5fb6e2d4cb]
./final[0x40111e]
/lib/libc.so.6(__libc_start_main+0xfd)[0x7f5fb6de3c4d]
./final[0x400d69]
薛定谔之死猫 2012-01-16
  • 打赏
  • 举报
回复
循环中使用完就关闭fd~
  • 打赏
  • 举报
回复
我明白了。linux内核对于一个文件被打开的次数是有上限规定的,不能无限制的打开。

但是如果不无限打开的话,我怎么样实时获得文件的内容呢?
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 gqjjqg 的回复:]

就是把你的fopen 放在循环外,while(1)里,在fopen的位置 换成 fflush一下 然后fseek到文件头,再读一行去判断..
当然fd 也要判断打开成功失败,fgets也要判断读出状态..
[/Quote]这样不行。无法检测的文件内容变化了,,,,
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 gqjjqg 的回复:]

引用 4 楼 wangyiyu3 的回复:

不太明白你说的 能给代码看下吗 刷新缓存不太懂

在fopen的位置 换成 [code=C/C++]fflush一下 然后fseek到文件头,再读一行去判断..
当然fd 也要判断打开成功失败,fgets也要判断读出状态..

您的回复正文中有非法词或词组! 各种不解...
[/Quote]fflush(fd);加上去了。但是还是运行一段时间之后fopen不能正确打开文件导致程序退出了。
您的回复正文中有非法词或词组!这个什么意思?
gqjjqg 2012-01-16
  • 打赏
  • 举报
回复
就是把你的fopen 放在循环外,while(1)里,在fopen的位置 换成 fflush一下 然后fseek到文件头,再读一行去判断..
当然fd 也要判断打开成功失败,fgets也要判断读出状态..
gqjjqg 2012-01-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wangyiyu3 的回复:]

不太明白你说的 能给代码看下吗 刷新缓存不太懂
[/Quote]
在fopen的位置 换成 [code=C/C++]fflush一下 然后fseek到文件头,再读一行去判断..
当然fd 也要判断打开成功失败,fgets也要判断读出状态..

您的回复正文中有非法词或词组! 各种不解...
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mscf 的回复:]

C/C++ code
fgets(x,11,fd);

-->
C/C++ code
fgets(x,10,fd);

使用x之前
C/C++ code
memset(x,'\0',sizeof(x));


你的打印语句打印的字符串基本上都是没法成功结束的,段错误可能由此引起,字符串以'\0'结尾,printf判断不出字符串什么时候结束,一直往下读读到不合法的线性地址就出现断……
[/Quote]fget(x,11,fd)这个没有问题 这个的意思是读取11-1=10个字符 改成10就是读9个 我的数组是11啊。我现在觉得问题可能是由于重复fopen文件,而没有关闭文件,无限打开文件不关闭导致运行一段时间后fget没法获取文件内容了。
薛定谔之死猫 2012-01-16
  • 打赏
  • 举报
回复
类似地,y变量也要那么处理下~
薛定谔之死猫 2012-01-16
  • 打赏
  • 举报
回复
fgets(x,11,fd);

-->
fgets(x,10,fd);

使用x之前
memset(x,'\0',sizeof(x));


你的打印语句打印的字符串基本上都是没法成功结束的,段错误可能由此引起,字符串以'\0'结尾,printf判断不出字符串什么时候结束,一直往下读读到不合法的线性地址就出现断错误了~
赵4老师 2012-01-16
  • 打赏
  • 举报
回复
请判断每次fgets的返回值!
  • 打赏
  • 举报
回复
现在我在while()里加上判断是否正确读取文件之后,发现是没有正确读取文件导致了fget()出现了段错误。
我现在不明白的是为什么开始循环里可以正确读取文件内容,程序运行一段时间之后却不能正确读取了呢?
spark_lx 2012-01-16
  • 打赏
  • 举报
回复
一般是在处理char *时候出错
  • 打赏
  • 举报
回复
不太明白你说的 能给代码看下吗 刷新缓存不太懂
gqjjqg 2012-01-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wangyiyu3 的回复:]

我的程序功能是这样的 不停的读取文本内容文件 当文本内容文件发生变化是截图摄像头当前的图片并且保存。
我在while(1)循环里fopen之后加上
if(NULL==fd)
{
printf("read file error!");
return 0;
}
运行一段时间之后 就出现读取错误了,现在……
[/Quote]

文件就开着就好了啊..每次刷新一下缓存不就好了,不用次次去open的...
  • 打赏
  • 举报
回复
我的程序功能是这样的 不停的读取文本内容文件 当文本内容文件发生变化是截图摄像头当前的图片并且保存。
我在while(1)循环里fopen之后加上
if(NULL==fd)
{
printf("read file error!");
return 0;
}
运行一段时间之后 就出现读取错误了,现在我不明白 为什么开始能够正常读取文件,一段时间之后却无法正常读取文本内容了呢?

这个程序是要一直运行的。
gqjjqg 2012-01-16
  • 打赏
  • 举报
回复
fd=fopen("hello.txt","r");


while(1)里面不停调用fopen,这个就算不出段错误也要出错的...
赵4老师 2012-01-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 gqjjqg 的回复:]
引用 4 楼 wangyiyu3 的回复:

不太明白你说的 能给代码看下吗 刷新缓存不太懂

在fopen的位置 换成 [code=C/C++]fflush一下 然后fseek到文件头,再读一行去判断..
当然fd 也要判断打开成功失败,fgets也要判断读出状态..

您的回复正文中有非法词或词组! 各种不解...
[/Quote]
回复文字中不要出现“代 码”
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 gqjjqg 的回复:]

引用 28 楼 wangyiyu3 的回复:

引用 26 楼 gqjjqg 的回复:

引用 25 楼 wangyiyu3 的回复:

引用 24 楼 gqjjqg 的回复:

引用 20 楼 wangyiyu3 的回复:

引用 18 楼 gqjjqg 的回复:

引用 15 楼 wangyiyu3 的回复:

我明白了。linux内核对于一个文件被打开的次数是有……
[/Quote]呵呵 我是小白。你得讲清楚才行。我现在把fopen前面加上一句fclos(fd);现在程序还在跑,已经运行5分钟了,没出现问题,再等一会,貌似问题解决了。再等会。
gqjjqg 2012-01-16
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 wangyiyu3 的回复:]

引用 26 楼 gqjjqg 的回复:

引用 25 楼 wangyiyu3 的回复:

引用 24 楼 gqjjqg 的回复:

引用 20 楼 wangyiyu3 的回复:

引用 18 楼 gqjjqg 的回复:

引用 15 楼 wangyiyu3 的回复:

我明白了。linux内核对于一个文件被打开的次数是有上限规定的,不能无限制的打开。

但是如果不无限……
[/Quote]

- -! 我晕,

光chmod 又没用,要在root下运行,不然你的文件是权限提高了,但是文件执行的权限还是在当前登录的用户下的....su一下切换到root,再运行..

普通用户下也是可以的,何必一定要提高到a+x...

加载更多回复(13)

69,371

社区成员

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

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