- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在标准 C 中,您如何可靠地检查写入标准 I/O 流的所有输出是否已成功保存到磁盘?
C 标准规定 fclose
成功时将返回 0,如果“检测到任何错误”,则返回 EOF。
但这是否意味着“在 fclose
调用期间检测到任何错误”?或者这是否意味着“自上次调用 clearerr
以来检测到任何错误”?
换句话说,程序只检查 fclose
的返回值是否足够? ,还是还要查ferror
?是否有任何实现,如果 ferror
返回非零值,随后调用 fclose
可能返回0?fflush
也是如此: 如果 fflush
总是这样吗?返回 0,随后调用 ferror
也会返回 0,如果 fflush
返回 EOF,随后调用 ferror
会返回非零吗?是否有任何实现不是这种情况?
(当然,我不考虑停电、小鬼等。是的,需要保证持久性的程序应该使用 fsync
,但这超出了标准 C 的范围。)
最佳答案
在没有更好的答案的情况下:
ferror()
返回定义为流状态一部分的“错误指示器”的状态。 clearerr()
和 rewind()
被定义为清除它。 ferror()
之外)应该做什么。 ferror()
会告诉你在某些 stdio 函数中发生了错误,因为 fopen()
(或最近的 clearerr()
或 rewind()
)。fclose()
可能会返回错误 (a) 如果在关闭时发生,或者 (b) 如果“错误指示器”已经设置。fclose()
这意味着一切都很好,因为 fopen()
(或最近的 clearerr()
或 rewind()
)。fclose()
可能会返回当前错误(再次),或新错误或根本没有错误。如果要返回错误,我将返回原始读/写错误。如果要报告错误,我将报告原始读/写错误和 fclose()
返回的任何错误。 . fgetc()
必须:errno
)fgetc()
意味着什么然后成功并返回 EOF
?ferror()
告诉您有关在最近的 stdio 函数调用之前可能发生的错误的任何信息。ferror()
对于那些错误返回与 EOF
相同的少数函数很有用或 WEOF
返回。 (如果可能出现值为 feof()
或 EOF
的字符,则 WEOF
很有用!)。ferror()
并且“错误指示器”可用于其他任何事情。 fgetc()
:
- If the end-of-file indicator for the input stream pointed to by stream is not set and a next character is present, the
fgetc
function obtains that character as an unsigned char converted to an int and advances the associated file position indicator for the stream (if defined).Returns
- If the end-of-file indicator for the stream is set, or if the stream is at end-of-file, the end-of-file indicator for the stream is set and the
fgetc
function returnsEOF
. Otherwise, thefgetc
function returns the next character from the input stream pointed to by stream. If a read error occurs, the error indicator for the stream is set and thefgetc
function returnsEOF
293).293) An end-of-file and a read error can be distinguished by use of the
feof
andferror
functions.
fgetc()
如果已经设置了“错误指示器”,应该这样做:
fgetc()
立即失败?errno
与第一次设置“错误指示器”时的值相同?EINTR
设置,去注意它是没有意义的。 fgetc()
如果此调用成功,清除“错误指示器”?EINTR
设置,让它设置是没有意义的。请注意,C 对 EINTR
一无所知...所以实现可以自由地使用“错误指示器”做不同的事情,这取决于它是如何设置的。fgetc()
恰好获取了一个值为 EOF
的字符或者碰巧碰到了实际的 EOF,那么不清除“错误指示器”将是一个错误! fputc()
:
- The
fputc
function writes the character specified byc
(converted to an unsigned char) to the output stream ...Returns
- The
fputc
function returns the character written. If a write error occurs, the error indicator for the stream is set andfputc
returnsEOF
.
fputc()
如果已经设置了“错误指示器”,则应该这样做。
fgetwc()
和
fputwc()
.
fgetc()
,
fputc()
,
fgetwc()
和 fputwc()`。
ferror()
:
- The
ferror
function tests the error indicator for the stream pointed to by stream.Returns
- The
ferror
function returns nonzero if and only if the error indicator is set for stream.
ferror()
并且应该使用“错误指示器”。
fflush()
(第 7.21.5.2 节),
fseek()
(第 7.21.9.2 节)和
fsetpos()
(第 7.21.9.3 节)都定义为在发生错误时设置“错误指示器”。
rewind()
(第 7.21.9.5 节)和
clearerr()
(第 7.21.10.1 节)被定义为清除“错误指示器”。
关于c - stdio 错误检测 : ferror versus fclose,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61828953/
在我的程序中,我可能会关闭一个已经关闭的文件。当我对一个已经关闭的文件执行 fclose 时会发生什么? 如果不能这样做,如何知道文件是关闭还是打开? 最佳答案 使用同一流调用 fclose 两次是未
为什么如果我们使用 fread() 读取文件并且不包含 fclose 来关闭相同的相同文件引用但它仍然有效。 但是,如果我们忘记在 fwrite 之后包含 fclose,那么它就不起作用。即没有写入文
我在 Linux 中运行程序时遇到段错误错误。在 AIX 中工作正常。 我在 gdb 中收到消息段错误... 程序接收信号SIGSEGV,段错误fclose@@GLIBC_2.2.5 () 来自/li
是否需要检查fclose的返回值?如果我们成功打开了一个文件,它关闭失败的可能性有多大? 最佳答案 当您fwrite到文件时,它实际上可能不会写入任何内容,它可能会保留在缓冲区中(FILE对象内部)。
假设我正在写入文件,但我想通过关闭机器电源来结束写入,这会是 fclose() 函数没有被调用的问题吗? FILE *f = fopen("file.txt", "w"); if (f == NULL
我正在尝试读取一个整数文件,其中包含文件中的整数个数作为第一个整数,但是当我在读取文件后尝试关闭该文件时,出现了段错误。 我读到,如果文件指针为空并且您尝试关闭它,则会出现段错误。但是,我在关闭它之前
我有以下 C++ 代码来将 shorts 写入 headless 音频文件: vectornShrtDecoded; nShrtDecoded.resize(iCountDecodedShorts);
我的程序有问题。使用函数 fclose() 后出现错误: "* Error in `./server': corrupted double-linked list: 0x000000000251a23
我在这段代码中遇到问题,它成功执行直到到达 fclose(fp) 语句,它崩溃了。 void read_file(const char *filename) { FILE *fp; i
为什么这个简单的函数会导致seg fault? int main(int argc, char** argv) { FILE* file1; file1 = fopen(argv[ar
每当我在最后使用 fclose(outputFile); 运行我的程序时,我都会收到错误消息。 glibc 检测到...损坏的双链表 不过,令人困惑的是,我在它的正上方有 fclose(inputFi
我最近构建了一个包装库 gorilla-audio 的 Ruby C 扩展。该库足够简单,代码干净,占用内存等。但是,当我尝试将库加载到 ruby 中时,它会抛出一个错误,内容如下: The pr
我正在编写一个函数 (*rwObjects()),它将读取格式化文件并保存它的字符串,一次一个对象。不幸的是,它对我的研究有限制 - stdio.h、stdlib.h 和 string.h 几乎是
我已经通过评论缩减了程序,缩减为: #include #include int main(int argc, char *argv[]) { FILE * in; in = fop
这个问题在这里已经有了答案: What happens if I don't call fclose() in a C program? (4 个答案) 关闭 7 年前。 根据我的阅读,fclose
我有两个函数。第一个函数是以写入模式打开一个文件并写入一些内容,然后关闭它。 FILE *fp = fopen("file.txt", "w"); //writing itnot file using
我尝试在 Linux 机器上使用 c++ fopen、fwrite、fflush 和 fclose 函数创建大约 4 GB 的文件,但我观察到 fclose() 函数需要很长时间才能关闭文件,大约需要
下面是 fclose 导致错误的源代码的一小部分?此函数并不总是被调用,在某些特定情况下会调用此函数。 int write_into_file (char * file_name) {
我一直在尝试在 C 中进行简单的文件处理,我想确保可以尝试使用此文件访问该文件 #include main() { CheckFile(); } int CheckFile() { i
是否需要检查fclose的返回值?如果我们成功打开了一个文件,它关闭失败的可能性有多大? 最佳答案 当您fwrite 到一个文件时,它实际上可能不会写任何东西,它可能会留在缓冲区中(在 FILE 对象
我是一名优秀的程序员,十分优秀!