C++中fopen的句柄返回NULL

2023-03-13  本文已影响0人  咸鱼Jay

我们在使用fopen打开文件的时候有时会出现失败返回null情况,但是我们不能直接通过log具体是什么原因导致的,所以这时我们可以通过errnostrerror获取错误码和错误信息。
我遇到的是错误码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

上一篇 下一篇

猜你喜欢

热点阅读