我无法打开/读取/关闭低级功能在Ubuntu中工作

时间:2013-04-12 15:43:28

标签: c linux posix

我正在尝试开发一个概念验证程序,它打开一个文件,读取一些数据并关闭它,所有这些都不使用fopen / getc / fclose函数。相反,我使用低级别开放/读取/关闭等价物,但没有运气:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>

int main ( int argc, char **argv ) {

    int fp;

    ssize_t num_bytes;

    if ( fp = open ( "test.txt", O_RDONLY ) < 0 ) {
            perror("Error opening file");
            return 1;
    }

    char header[2];

    while ( num_bytes = read ( fp, &header, 2 ) > 0 )
            printf("read %i bytes\n", num_bytes);

    printf("done reading\n");

    close ( fp );

    return 0;
}

如果没有文件,请打开正确的错误信息。另一方面,如果文件存在,程序会在read()函数中停止,原因不明。对此有何帮助?

3 个答案:

答案 0 :(得分:6)

由于operator precedence

,这是不正确的
if ( fp = open ( "test.txt", O_RDONLY ) < 0 )

因为=的优先级低于<。这意味着fp将分配01,具体取决于open ( "test.txt", O_RDONLY ) < 0的结果。

  • 当文件不存在时,条件为-1 < 0,其结果为1fp已分配1if分支为输入。
  • 当文件存在时,条件为N < 0(其中N将大于2 stdinstdoutstderr占用文件描述符{ {1}},01)和2被分配fp,并且未输入0分支。然后该程序继续if行,read()的值为fp0因此等待从{{1}读取内容时停止}。

更改为:

stdin

同样的问题:

stdin

答案 1 :(得分:1)

改变这个:

while ( num_bytes = read ( fp, &header, 2 ) > 0 )

while ( (num_bytes = read ( fp, &header, 2 )) > 0 )

答案 2 :(得分:0)

'&LT;'或者&gt;'优先于'='

因此比较的结果将是'0'或'1'将分配给fp。

修改如下代码,

if((fp = open(“test.txt”,O_RDONLY))&lt; 0)