Linux&;C:';write()';不将任何内容写入文件
我有一个简单的任务要用这个例程完成,它所要做的就是打开文件,从缓冲区追加数据&关闭。 为此,我在linux机器上使用了“open”和“write”。虽然“write()”之后的返回代码为正数,但文件大小不会增加,并且始终为空。我想弄清楚下面的代码有什么问题。我想一些新鲜的眼睛可以给你一些启示Linux&;C:';write()';不将任何内容写入文件,c,linux,file-io,C,Linux,File Io,我有一个简单的任务要用这个例程完成,它所要做的就是打开文件,从缓冲区追加数据&关闭。 为此,我在linux机器上使用了“open”和“write”。虽然“write()”之后的返回代码为正数,但文件大小不会增加,并且始终为空。我想弄清楚下面的代码有什么问题。我想一些新鲜的眼睛可以给你一些启示 #define BIT_Q_FILE ".\\bitq.dat" int BQWrite(void *p) { int fd ; int rc = -1 ; fd = open(BIT_Q_FILE,
#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 ;
}
#定义位文件“\\bitq.dat”
int-BQWrite(void*p)
{
int-fd;
int rc=-1;
fd=打开(位Q文件,O_RDWR | O_追加);
如果(fd<0)
返回-1;
memset(&BITQBuff,0,sizeof(typeBITQFile));
memcpy(&BITQBuff.pBitQueue,p,sizeof(typeBITQueue));
rc=写入(fd,&BITQBuff,sizeof(typeBITQFile));
关闭(fd);
if(rc!=sizeof(typeBITQFile))
{
返回-1;
}
rc=sizeof(typeBITQueue);
返回rc;
}
尝试更改
#define BIT_Q_FILE ".\\\bitq.dat"
到
你的问题就在这里:
#define BIT_Q_FILE ".\\bitq.dat"
您遇到了三个Windows到Unix的移植难题:
- Unix上的目录分隔符是
,而不是/
\
但是,Unix非常乐意让您在文件名中间放置<代码> \/COD>。(pathname组件中不能出现的字节(我指的是字节,而不是字符)只有值为0x2F和0x00的字节。)
- Unix也非常乐意让文件名以点开头;但是,默认情况下,
不会打印任何以点开头的文件名ls
bitq.dat
的文件,但实际上它正在写入名为\bitq.dat
的文件,该文件仍在当前目录中。默认情况下,该文件是隐藏的,因此看起来数据正在消失ls-a
将显示隐藏的文件,rm。\\bitq.dat
将删除它。要修复代码,只需将define更改为
#define BIT_Q_FILE "bitq.dat"
无需在传递到open
的路径上放置前导的/
这可能不是您的代码的唯一问题,但我看不出还有任何明显的错误。如果您需要更多帮助,请发布一个新问题,其中包含一个完整的、最少的测试程序,人们可以自己编译和运行。您能试试
fflush(fd)
看看这是否有帮助吗close
刷新缓冲区,但只覆盖所有基础。另外,调用write
后,rc
包含的值是什么?打印从sizeof运算符获得的值。@Levon,fflush()
在FILE*
上操作,而不是在低级描述符上操作。写入操作后文件的最后修改日期是否会更改?@hristoilev感谢Hristo,我怀疑是一个未冲洗的缓冲区。。学到了一些新东西,甚至只是“bitq.dat”。另外,检查工作目录。那里有一个名为\bitq.dat
的文件。因为它的名字以
开头,所以它是一个隐藏文件。谢谢。只是“bitq.bat”有帮助。是的,现在我在该文件夹中看到“.\bitq.bat”文件。我怎样才能摆脱它。系统命令“rm”没有帮助。我尝试这样做时得到的消息如下:“rm:cannotremove'.bitq.bat':没有这样的文件或目录”,但当我执行'll'或'ls-la'时,我可以看到该文件。有什么想法吗?@GregInozemtsev Greg,即使是-f&-fr选项也没有帮助!您需要键入带有两个反斜杠的rm。\\bitq.bat
。shell将反斜杠视为转义字符(遗憾的是,它的含义与C完全不同,但这个问题的效果是相同的)。另一种方法是rm-i.*bitq.bat
——这是一种更通用的策略,用于清除名称中包含无法键入的奇怪字符的文件。谢谢。这正是正在发生的事情。很好的接球。非常感谢。这真的很有帮助。
#define BIT_Q_FILE "bitq.dat"