gpt4 book ai didi

c - S_ISREG 返回 0

转载 作者:行者123 更新时间:2023-12-02 18:55:07 24 4
gpt4 key购买 nike

所以我想测试给定的文件是否正常。

#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 语句,这些语句具有一组您可以删除的冗余括号。你想避免这种情况,因为那些额外的括号可以消除关于你所做的事情的警告。

关于c - S_ISREG 返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66284985/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com