2

我有一个简单的任务要完成这个例程,它所要做的就是打开文件,从缓冲区附加数据并关闭。为此,我在 linux 机器上使用了“open”和“write”。虽然 '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 ;
}
4

2 回答 2

7

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

#define BIT_Q_FILE  ".\\bitq.dat"

您已经遇到了 Windows 到 Unix 移植问题的三重奏:

  • Unix 上的目录分隔符是/,而不是\
  • 但是 Unix 非常乐意让你\在文件名中间加入。(唯一不能出现在路径名组件中的字节——我真正的意思是字节,而不是字符——是那些值为 0x2F 和 0x00 的字节。)
  • Unix 也非常乐意让文件名以点开头但是,默认情况下ls不打印任何以点开头的文件名。

因此,您希望将数据写入bitq.dat当前目录中名为的文件,但实际上正在将数据写入.\bitq.dat仍在当前目录中的名为 的文件中。该文件默认是隐藏的,因此看起来数据正在消失在空气中。 ls -a将显示隐藏文件,rm .\\bitq.dat并将其删除。要修复您的代码,只需将定义更改为

#define BIT_Q_FILE "bitq.dat"

没有必要./在传递给 的路径上放置前导open

这可能不是您的代码的唯一问题,但我没有看到任何其他明显错误的地方。如果您需要更多帮助,请发布一个新问题,其中包含一个完整的、 最小的测试程序,人们可以自己编译和运行。

于 2012-05-08T19:38:20.743 回答
4

尝试改变

#define BIT_Q_FILE  ".\\\bitq.dat"

#define BIT_Q_FILE  "./bitq.dat"
于 2012-05-08T19:35:08.237 回答