LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1263|回复: 7

无法写入文件问题

[复制链接]
发表于 2005-11-29 15:08:31 | 显示全部楼层 |阅读模式
您好!我用以下代码创建并写入文件,文件可以正确创建,但不能正确写入,文件还是空的,而返回值i都是正确的.
请大侠指教,谢谢!

#include <errno.h>
#include <time.h>
#include <sys/stat.h>
#include <fcntl.h>

static time_t t;

static struct tm* tm;
static int fd;
static char filename[16],endflg=0xFF;
static char filehead[10]={'a','b','c','d','e','f','g','h','i','j'};
static char serialno[12]={'1','2','0','0','0','1','3','4','5','1','0','0'};

void main(void)
{
        int i;
        unsigned char *p;
        time(&t);

        tm =localtime(&t);
        sprintf(filename,"/%02d%02d%02d%02d%02d%02d.dat",tm->tm_year-100,1+tm->tm_mon,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);
printf(filename);
        if(fd=open(filename,O_RDWR | O_CREAT,S_IRUSR | S_IWUSR)==-1)
        {
printf("open file error\n");
        }
        i=write(fd,filehead,10);
printf("i=%d\n",i);
        i=write(fd,serialno,12);
printf("i=%d\n",i);
        i=write(fd,&endflg,1);
printf("i=%d\n",i);
        write(fd,&endflg,1);
        close(fd);
}
发表于 2005-11-29 16:59:16 | 显示全部楼层
是有点奇怪哈,open返回的是0,结果都写到屏幕上了
在open之前调用close(0)后结果对了
不过我建议不要在/下写文件
回复 支持 反对

使用道具 举报

发表于 2005-11-29 17:03:26 | 显示全部楼层
知道了,缓冲区溢出,你的filename太小了
回复 支持 反对

使用道具 举报

发表于 2005-11-29 17:09:48 | 显示全部楼层
应该改成如下:

if((fd=open(filename,O_RDWR | O_CREAT,S_IRUSR | S_IWUSR))==-1)

if(fd=open(filename,O_RDWR | O_CREAT,S_IRUSR | S_IWUSR)==-1)
这是原来的, 少了层括号。

返回 0 以后就打印到标准输出了。
回复 支持 反对

使用道具 举报

发表于 2005-11-29 17:10:44 | 显示全部楼层
还是penguin细心,呵呵,这个程序问题真不少阿
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-1 10:12:17 | 显示全部楼层
原来就一个括号的问题,呵呵,问题已解决,多谢X11和walte指导!
回复 支持 反对

使用道具 举报

发表于 2005-12-1 12:05:38 | 显示全部楼层
哪里只是一个括号,括号只是造成你看到的现象的直接原因
其他比如在/下建立文件、字符串缓冲区过小都是问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-1 12:22:28 | 显示全部楼层
x11,您好!首先感谢您的指导,关于在/下建立文件会产生什么问题呢?
您说字符串缓冲区过小,我是以时间来取文件名,算一下长度刚好,为什么说过小呢?
谢谢!
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表