Linux open/fopen对文件操作

https://blog.csdn.net/jaken99/article/details/77686427 lseek 注意fseek的区别,设置读写位置
https://blog.csdn.net/oscarjulia/article/details/72638060 一般open打开设备文件(二进制),fopen打开普通文件
https://blog.csdn.net/lyj2014211626/article/details/71844122 fopen w+ 创建读写 r+ 读写不能创建 r 只读 w只写
https://blog.csdn.net/MAOTIANWANG/article/details/17504771 umask 屏蔽权限使用

以下是我之前在展锐平台上做双摄标定数据存储的部分实现代码(简化版),涉及到一些客制化metadata的添加,从CaptureRequest中取requset的metadata就不细说啦,基于Android平台读写对应分区文件还需要注意sepolicy,具体的存储方式格式等可自己添加,主要是对一些固定的实现函数fopen open等做一个记录(在Linux平台上应该也适用吧),方便回忆

#define DATA_PATH "/mnt/vendor/productinfo/results.bin"
#define RESULT_PATH "/mnt/vendor/productinfo/result"
#DATA_SIZE 2048

//open 写数组到bin文件中 [umask open(O_RDWR | O_CREAT ) lseek(SEET_SET) write close]
bool saveData(const uint8_t *data)
{
   mode_t pCurMask = umask(0);  //返回原来的umask值,umask用于屏蔽对应用户,组,其他的读写执行权限 
   int Fd;
   Fd = open(DATA_PATH, O_RDWR | O_CREAT, 0777);
   if (Fd == -1) {
        HAL_LOGE("can't open %s \t error msg: %s\n", DATA_PATH, strerror(errno));
        return false;
   } 
    if (-1 == lseek(Fd, 0, SEEK_SET)) { //SEEK_SET 设置新的读写位置,SEEK_CUR当前位置偏移,SEEK_END文件尾部偏移    
        HAL_LOGE("lseek error msg: %s\n", strerror(errno));
        close(Fd);
        return false;
    }

    if (data[0] != '0' && strlen((char*)data) != 1) {
        if (-1 == write(Fd, data, DATA_SIZE)) {
            HAL_LOGE("write error msg: %s\n", strerror(errno));
            close(Fd);
            return false;
        }
    } 
    close(Fd);
    Fd = -1;
    umask(pCurMask);  //复原,每个进程都有其原来的umask值 umask值为8进制

    return true;
}

//fopen 写到普通文件中 [fopen( w+ r+ ) fprintf fclose]
bool SaveResult(const int32_t Result)
{
    FILE*  pResult = NULL;
    mode_t pCurMask = umask(0);
    pResult = fopen(RESULT_PATH, "w+");
    if (pResult == NULL) {
         HAL_LOGE(" can't open %s \t error msg: %s\n", RESULT_PATH, ::strerror(errno)); //::代表全局函数调用
         return false;
    }

    fprintf(pResult, "%d\n", Result);// fprintf fputs fputc 三种写入
    fclose(pResult);
    pResult = NULL;
    umask(pCurMask);
    
    return true;
}

//open 从bin文件中读出数组 [open lseek( SEEK_SET ) read close]
bool readData(uint8_t *data)
{
    int nr, cnt = 0;
    uint32_t readCnt = 0;

    int readFd = open(DATA_PATH, O_RDONLY);
    if (readFd < 0) {
        ALOGE("readData can't open %s \t error msg: %s\n", DATA_PATH, strerror(errno));
        return false;
    }

   if (-1 == lseek(readFd, 0, SEEK_SET)) {
        ALOGE("readData lseek error msg: %s\n", strerror(errno));
        close(readFd);
        return false;
    }

    if (-1 == read(readFd, data, DATA_SIZE)) {
            ALOGE("readData write error msg: %s\n", strerror(errno));
            close(readFd);
            return false;
        }

    close(readFd);
    readFd = -1;
    return true;
}

//fopen 从普通文件中读取 [fopen fseek(SEEK_SET) fread fclose]
bool getResult(int32_t *data, int32_t count)
{
   
    FILE*  pResult = NULL;
    char read_buf=0;

    pResult=fopen(RESULT_PATH,"r+");
    if (pResult ==NULL)
    {
        ALOGE(" can't open RESULT_PATH path error msg: ");
        return false;
    }

    if ((fseek(pResult,0,SEEK_SET))  < 0) //注意lssek和fseek的区别  fseek对应stream流  lseek对应open
    {
        ALOGE(" fseek error msg: %s\n", ::strerror(errno));
        fclose(pResult);
        return false;
    }

    size_t read_ret = fread (&read_buf, sizeof(char), sizeof(char),pResult);
    if (read_ret < 0)
    {
        ALOGE(" can't fread  RESULT_PATH file error msg: ");
        fclose(pResult);
        return false;
    }

    if(read_ret == sizeof(read_buf))
    {
        ALOGI("getResultbuf = %d,%d\n",read_buf,__LINE__);
    }else
    {
        ALOGI("getResultfread fali!!!buf = %s,%d\n",read_buf,__LINE__);
    }
    fclose(pResult);
    pResult = NULL;
    int is_read_buf = read_buf -'0';
    *data = is_read_buf;
    
    return true;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值