fwrite失败,如何知道失败的具体原因
时间: 2023-07-11 10:43:35 浏览: 123
在使用`fwrite`函数时,如果返回值小于要写入的数据块数,就表示写入失败了。可以通过调用`ferror`和`errno`函数来获取写入失败的具体原因。
具体来说,`ferror`函数用于检测文件流上的错误标志,如果返回非0值,则表示文件流上已经设置了错误标志。而`errno`则是一个全局变量,用于保存最近一次发生的系统错误码。一般情况下,在调用一些系统函数时,如果函数返回-1,则可通过查看`errno`的值来确定错误类型。
下面是一个使用`fwrite`写入文件,并检测错误的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main() {
FILE *fp;
char str[] = "Hello World!";
int n = strlen(str);
int ret;
fp = fopen("test.txt", "w");
if (fp == NULL) {
printf("Failed to open file: %s\n", strerror(errno));
exit(1);
}
ret = fwrite(str, sizeof(char), n, fp);
if (ret < n) {
if (ferror(fp)) {
printf("Failed to write file: %s\n", strerror(errno));
} else {
printf("Failed to write file: Unkown error\n");
}
exit(2);
}
fclose(fp);
printf("Write file success!\n");
return 0;
}
```
在示例代码中,首先使用`fopen`打开一个文件,如果打开失败,则通过`strerror(errno)`函数获取错误信息并打印,然后退出程序。接着使用`fwrite`向文件中写入数据,如果写入失败,则通过`ferror`和`errno`函数来获取失败原因,并打印错误信息。最后通过`fclose`关闭文件。
需要注意的是,在使用`errno`变量时,应该保证其在当前线程中是可重入的,否则可能会导致错误的结果。
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![ppt](https://img-home.csdnimg.cn/images/20210720083527.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)