我正在使用管道和分支的程序,需要将写入结束更改为输出文件。但是当我打开一个文件时,文件描述符为0,这通常是stdin,但我认为这是我的一些问题的原因。这是我的代码
if (outputfd = open("file", O_RDWR | O_CREAT | O_TRUNC) == -1)
{
// open failed
}
有人可以告诉我为什么它是0吗?或者如何解决它?
答案 0 :(得分:7)
outputfd
不是输出文件描述符,而是等于FALSE
(0)。这是因为open
返回的文件描述符不是== -1
应该是:
outputfd = open("file", O_RDWR | O_CREAT | O_TRUNC);
if (outputfd < 0)
{
// error handling code
}
或者它应该是:
if ( ( outputfd = open("file", O_RDWR | O_CREAT | O_TRUNC) ) == -1)
{
// error handling code
}
请注意,这需要3个额外的括号 - 一个右括号和两个左括号。
答案 1 :(得分:5)
这是因为你将它与-1
进行比较。
outputfd
无法获得open
的结果。它得到-1
的检查结果。
答案 2 :(得分:5)
只是说明doron's answer:
>> outputfd = open("file", O_RDWR | O_CREAT | O_TRUNC) == -1)
让我们简化:首先删除错误并添加额外的标点以使其看起来像一个真正的诡计
outputfd = open("file", O_RDWR | O_CREAT | O_TRUNC) == -1;
现在,用占位符替换函数参数
outputfd = open(<PLACEHOLDER>) == -1;
添加括号
outputfd = (open(<PLACEHOLDER>) == -1);
open()-1的结果是什么时候?当操作失败时。因此,我们假设操作没有失败并用正数替换open
outputfd = (<POSITIVENUMBER> == -1);
没有正数可以等于-1(禁止转换问题)所以等式测试总是假的...而且假的,C
中的定义是0
outputfd = 0;
答案 3 :(得分:3)
在C中,关系运算符具有higher precedence而不是赋值运算符。