我有一个简单的任务要完成这个例程,其中所有必须做的就是打开文件,从缓冲区附加数据&关。 我正在使用'开放'和为了这个目的在Linux机器上“写”。虽然'write()'之后的返回码是正数,但文件大小不会增加,而且总是为空。我拉我的头发来弄清楚下面代码的问题。认为一些新鲜的眼睛可以有所启发。
#define BIT_Q_FILE ".\\bitq.dat"
int BQWrite(void *p)
{
int fd ;
int rc = -1 ;
fd = open(BIT_Q_FILE, O_RDWR | O_APPEND ) ;
if (fd < 0)
return -1;
memset(&BITQBuff,0,sizeof(typeBITQFile));
memcpy(&BITQBuff.pBitQueue,p,sizeof(typeBITQueue));
rc = write(fd, &BITQBuff,sizeof(typeBITQFile)) ;
close(fd) ;
if(rc!=sizeof(typeBITQFile))
{
return -1;
}
rc = sizeof(typeBITQueue);
return rc ;
}
答案 0 :(得分:7)
我在这里遇到了你的问题:
#define BIT_Q_FILE ".\\bitq.dat"
你已经遇到了Windows-to-Unix移植陷阱的三连胜:
/
,而不是\
。\
放在文件名的中间。 (仅字节 - 我的意思是字节,而不是字符 - 不能出现在路径名组件中的是值为0x2F和0x00的那些。)ls
不会打印任何以点开头的文件名。因此,您希望将数据写入当前目录中名为bitq.dat
的文件,但实际上它正在写入名为.\bitq.dat
的文件,仍在当前目录中。该文件默认是隐藏的,因此看起来数据正在消失。 ls -a
会显示隐藏文件,rm .\\bitq.dat
会将其删除。要修复代码,只需将define更改为
#define BIT_Q_FILE "bitq.dat"
没有必要在传递给./
的路径上放置前导open
。
这可能不是您的代码唯一的问题,但我没有看到任何其他明显错误。如果您需要更多帮助,请使用完整的,最小测试程序发布一个新问题,人们可以自行编译和运行。
答案 1 :(得分:4)
尝试更改
#define BIT_Q_FILE ".\\\bitq.dat"
到
#define BIT_Q_FILE "./bitq.dat"