我遇到的一个意想不到的价值errno在使用perror与glibc.当指定不存在的文件时,arg[1]它按预期打印Error: 2(即ENOENT).但是当perror下面的行被取消注释时,EINVAL无论我传递什么,它都会抛出错误22().任何人都可以解释为什么这个设置?
编辑:看起来这是某种Eclipse错误.IDE似乎导致perror引发某种错误,该程序在命令行上运行完美,并且在Eclipse中的参数列表中指定了正确的文件时工作正常.在Eclipse内部运行时它会失败.
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
int main(int argc, char *argv[]) {
FILE *input_file;
input_file = fopen(argv[argc - 1], "r");
if (!input_file) {
// perror(argv[argc-1]);
fprintf(stderr, "Error: %d\n", errno);
return (EXIT_FAILURE);
}
else {
fclose(input_file);
}
return (EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)
你不能依赖于errno调用其他库函数之后的值,换句话说你对perror()本身的调用可能会修改errno 你需要将它保存在临时变量中的值,如果你想能够使用它的话调用其他库程序后.
if (!input_file) {
int err = errno;
perror(argv[argc-1]);
fprintf(stderr, "Error: %d\n", err);
return (EXIT_FAILURE);
}
Run Code Online (Sandbox Code Playgroud)