Chinaunix

标题: 求救,fopen的问题 [打印本页]

作者: iamfog    时间: 2006-08-16 23:10
标题: 求救,fopen的问题
截取的相关的代码如下

  1. FILE *fp;

  2. if((fp=fopen("/home/tmp/a.txt","w+")) == NULL)
  3.      printf("open file error!\n");
  4. ......
复制代码


现在的问题如下
那个a.txt原本是不存在的,程序能正常在tmp下建立a.txt这个文件,且有读写的权限
但是a.txt写不进任何的数据,大小始终是为0。而且在程序的最后用fclose的话会导致
coredump

请问高手们这是怎么回事呢?实在是很郁闷
作者: funnyt    时间: 2006-08-16 23:38
改用wb+
或者("//home//tmp//a.txt","wb+")) == NULL)
试试
作者: luckyfeng_1126    时间: 2006-08-16 23:41
用r+好像也可以
作者: iamfog    时间: 2006-08-16 23:57
谢谢楼上的朋友。
2楼的
我是unix系统 不区分那两种方式的
用‘//’这样的方法 没什么用吧 因为文件已经建好了 只是写不进去数据
好象是fopen返回给fp的值有问题 因为这个所以导致fclose的时候coredump

3楼的
r+和w+对我这个程序影响不大
作者: isnowran    时间: 2006-08-17 00:02
都打开成功了,贴出来有什么用?写数据的代码呢?
作者: flw2    时间: 2006-08-17 00:06
iamfog :

你的帖子对于问题解决没有什么价值.
作者: iamfog    时间: 2006-08-17 13:56
给各位道歉了
没有经验 不懂得提问的方法 以后会想好再发帖问的
先谢谢楼上的朋友了。

因为fopen打开文件成功了,但fcose(fp)有问题,
以为fprintf的返回值不会影响到fp 所以没去检查fprintf的使用
经楼上的朋友们的提醒,去检查了下 发现是先面这行代码出了问题
a,b为字符数组,i,j为整数。
  1. fprintf(fp,"%s%d%d\n",a,b,i,j);
复制代码

多了一个参数,导致fclose(fp)的时候coredump
但是为什么fprintf的返回值会影响到fp呢 导致fclose的失败?

为了验证 我写了如下的测试代码
虽然有警告 但是却能够正常的执行 fclose也没有导致coredump 而且数据也正常写入了文件

  1. #include<stdio.h>

  2. int main()
  3. {
  4.     FILE *fp;
  5.    
  6.     char a[10]="123456";
  7.     char b[5]="ttt";

  8.     int i = 1;
  9.     int j = 2;

  10.     int n = 0;

  11.     if((fp=fopen("/home/tmp/1.txt","w+"))==NULL)
  12.     {
  13.           printf("can't open file");
  14.           return -1;
  15.      }

  16.      n=fprintf(fp,"%s%d%d\n",a,b,i,j);
  17.      printf("%d\n",n);

  18.      fclose(fp);
  19.      return 0;
  20. }
复制代码


我的机器是sco5.06  结果如下
n=16
1.txt的文件写入的内容为1234568043985681

搞不明白的是为什么前面那样写会导致fclose的coredump
后面的测试程序又可以通过呢

请高手指点迷津 谢谢。
作者: foolfoolbird    时间: 2006-08-17 14:15
  1. n=fprintf(fp,"%s%s%d%d\n",a,b,i,j);
复制代码

是不是要写成这样啊!
作者: iamfog    时间: 2006-08-17 14:20
本来是只要写3个数据到文件中去 我写错了,多传了一个
结果导致了fclose(fp)时候的coredump

但是同样的测试程序却一点问题都没有 所以感觉很奇怪
而且fprintf的返回值怎么会影响到fp呢
作者: scutlzp    时间: 2006-08-17 14:55
fprintf(fp,"%s%d%d\n",a,b,i,j);

第一个%s有问题,你传的是字符char类型,而%s需要一个char *类型啊,,char类型被转换成产char *了,
程序很可能就coredump了
作者: 酷酷长大了    时间: 2006-08-18 10:25
但是为什么fprintf的返回值会影响到fp呢 导致fclose的失败?

-------
并不是影响到,而是没执行到fclose。
少一个参数应该没影响的,应该是变量不能强制转换导致coredump吧!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2