我們在使用fopen打開文件的時候有時會出現失敗返回null情況,但是我們不能直接通過log具體是什么原因導致的,所以這時我們可以通過errno
和strerror
獲取錯誤碼和錯誤信息。
我遇到的是錯誤碼1,Operation not permitted。
經過檢查是Android11,分區存儲,不能直接寫到sdcard,后面修改為直接用app目錄,就正常了
Context.getExternalFilesDir(null).getAbsolutePath(); //不需要權限/storage/emulated/0/Android/data/[appname]/files/
常見的errno
錯誤碼有以下這些:
#define EPERM 1 /* Operation not permitted */
#define ENOENT 2 /* No such file or directory */
#define ESRCH 3 /* No such process */
#define EIO 5 /* I/O error */
#define ENXIO 6 /* No such device or address */
#define E2BIG 7 /* Argument list too long */
#define ENOEXEC 8 /* Exec format error */
#define EBADF 9 /* Bad file number */
#define ECHILD 10 /* No child processes */
#include "File.h"
#include <cerrno>
#include <cstring>
#include "Log.h"
void saveYuvFile(const uint8_t* data, int width, int height, const char* filePath){
if (data == nullptr)
return;
FILE* fp = fopen(filePath, "w");
int errNum = 0;
if (fp == nullptr){
errNum = errno;
LOGE("[saveYuvFile] open fail errno = %d, reason = %s", errNum, strerror(errNum));
return;
}
size_t dataSize = width * height * 3 / 2;
fwrite(data, sizeof(uint8_t), dataSize, fp);
fclose(fp);
}
參考:https://blog.csdn.net/xu20082100226/article/details/121406513