Linux& C:'write()'没有写任何文件

时间:2012-05-08 19:28:27

标签: c linux file-io

我有一个简单的任务要完成这个例程,其中所有必须做的就是打开文件,从缓冲区附加数据&关。 我正在使用'开放'和为了这个目的在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 ;
}

2 个答案:

答案 0 :(得分:7)

我在这里遇到了你的问题:

#define BIT_Q_FILE  ".\\bitq.dat"

你已经遇到了Windows-to-Unix移植陷阱的三连胜:

  • Unix上的目录分隔符是/,而不是\
  • 但是Unix很高兴让你把\放在文件名的中间。 (字节 - 我的意思是字节,而不是字符 - 不能出现在路径名组件中的是值为0x2F和0x00的那些。)
  • Unix也非常乐意让文件名开头;但是,默认情况下,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"