Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux&;C:';write()';不将任何内容写入文件_C_Linux_File Io - Fatal编程技术网

Linux&;C:';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,

我有一个简单的任务要用这个例程完成,它所要做的就是打开文件,从缓冲区追加数据&关闭。 为此,我在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 ;
}
#定义位文件“\\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"