我正在尝试开发一个概念验证程序,它打开一个文件,读取一些数据并关闭它,所有这些都不使用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()函数中停止,原因不明。对此有何帮助?
答案 0 :(得分:6)
if ( fp = open ( "test.txt", O_RDONLY ) < 0 )
因为=
的优先级低于<
。这意味着fp
将分配0
或1
,具体取决于open ( "test.txt", O_RDONLY ) < 0
的结果。
-1 < 0
,其结果为1
且fp
已分配1
且if
分支为输入。N < 0
(其中N
将大于2 stdin
,stdout
和stderr
占用文件描述符{ {1}},0
和1
)和2
被分配fp
,并且未输入0
分支。然后该程序继续if
行,read()
的值为fp
,0
因此等待从{{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)