所以我想测试给定的文件是否为常规文件
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
int main(int argc, char **argv)
{
// Input check.
if (argc != 2) {
fprintf(stdout,"Format: %s <filename.txt>n", argv[0]);
return -1;
}
// Make sure the file is a regular file.
int fd;
if ((fd = open(argv[1], O_RDONLY) == -1)) {
fprintf(stdout, "%s", strerror(errno));
return -1;
}
struct stat st;
if ((fstat(fd, &st) == -1)) {
fprintf(stdout, "%sn", strerror(errno));
return -1;
}
if (!(S_ISREG(st.st_mode))) {
fprintf(stdout, "Error, invalid filen");
return -1;
}
close(fd);
return 0;
}
我运行:.a in.txt
我不知道到底发生了什么,但是当我试图测试文件是否正常(最后一个if语句)时,它失败了。我测试了fstat是否失败,但是没有。
问题来了:
if ((fd = open(argv[1], O_RDONLY) == -1)) {
相等运算符==
的优先级高于赋值运算符=
。所以上面的解析为:
if (fd = (open(argv[1], O_RDONLY) == -1)) {
将比较的结果赋给fd
,该结果将为0或1。这些值恰好都是标准输入和标准输出的有效打开文件描述符,因此fstat
调用成功并获得其中一个流的状态。
你需要先调整圆括号来完成赋值:
if ((fd = open(argv[1], O_RDONLY)) == -1) {
同样,看起来你有其他if
语句有一组冗余的括号,你可以删除。您需要避免这种情况,因为这些额外的括号可以屏蔽有关您所做操作的警告。