gpt4 book ai didi

c - 带有错误指示器集的文件操作

转载 作者:行者123 更新时间:2023-12-01 01:25:47 25 4
gpt4 key购买 nike

在解析字符和子字符串时,我必须从 C 中的流中单独读取它们。我还想检查输入错误。显而易见的方法是:

c = fgetc(f);
if(ferror(f)) {
puts(strerror(errno));
exit(1);
}
/* do something with c */
c = fgetc(f);
if(ferror(f)) {
puts(strerror(errno));
exit(1);
}
/* do something with c */

等等。但是,如果我可以完成所有输入操作并稍后检查错误指示器,那将更加实用和快速(在没有错误的非异常情况下):

c = fgetc(f);
/* do something with c */
c = fgetc(f);
/* do something with c */
if(ferror(f)) {
puts(strerror(errno));
exit(1);
}

如果 fgetc()、scanf() 等输入操作在设置 f 的错误指示符时是简单的直通无操作,这将是可能的。比如说,第一个 fgetc() 中发生错误,因此第二个 fgetc() 是一个失败的空操作,但既不改变 f 的错误指示符也不改变 errno。

关于输出函数可能会问到类似的问题。

我的问题是:这是 stdio 函数的行为吗?我可以在所有操作之后检查 ferror(f) 并获取 errno 然后如果我确定所有那些“用 c 做某事”不会改变 errno 吗?

谢谢!

最佳答案

不,那些不是 errno 定义的语义。

引用 this manual page :

Its value is significant only when the return value of the call indicated an error (i.e., -1 from most system calls; -1 or NULL from most library functions); a function that succeeds is allowed to change errno.

这意味着如果您要执行两个 I/O 操作,其中第一个失败,第二个是“无操作”(如读取零字节),它可能会成功并选择清除 errno,从而删除第一次调用设置的错误。

关于c - 带有错误指示器集的文件操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35622630/

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