如何解决S_ISREG 返回 0
所以我想测试给定的文件是否正常。
#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,"%s\n",strerror(errno));
return -1;
}
if (!(S_ISREG(st.st_mode))) {
fprintf(stdout,"Error,invalid file\n");
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。这些值碰巧都是 stdin 和 stdout 的有效打开文件描述符,因此 fstat
调用成功并获得您可以了解这些流之一的状态。
您需要先调整括号以进行分配:
if ((fd = open(argv[1],O_RDONLY)) == -1) {
此外,您似乎还有其他 if
语句,其中包含一组可以删除的冗余括号。您想避免这种情况,因为那些额外的括号可以使有关您所做的事情的警告静音。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。