测试用新建文件写入数据代码

#ifdef FILTE_MANAGE_TEST
#include 
#include 
#include 
#include 

#define FILEMANAGE_PATH "/mnt/datatest/"
#define FILEMANAGE_FILE_HEAD "test_"

#define FILEMANAGE_ERR_OK              (0)
#define FILEMANAGE_ERR_BASE            (0x10000000)
#define FILEMANAGE_ERR_INVALID_PARAM   (0x00000001 + FILEMANAGE_ERR_BASE)
#define FILEMANAGE_ERR_NULL_POINTER    (0x00000002 + FILEMANAGE_ERR_BASE)
#define FILEMANAGE_ERR_PROCESS_FAILED  (0x00000003 + FILEMANAGE_ERR_BASE)
#define FILEMANAGE_ERR_NOT_READY       (0x00000004 + FILEMANAGE_ERR_BASE)
#define FILEMANAGE_ERR_INIT_FAILED     (0x00000005 + FILEMANAGE_ERR_BASE)
#define FILEMANAGE_ERR_ALLOC_MEM_FAIED (0x00000006 + FILEMANAGE_ERR_BASE)
#define FILEMANAGE_ERR_OPEN_FILE_FAILE (0x00000007 + FILEMANAGE_ERR_BASE)

typedef struct {
     
    char            riffType[4];    //4byte,资源交换文件标志:RIFF   
    unsigned int    riffSize;       //4byte,从下个地址到文件结尾的总字节数  
    char            wavType[4];     //4byte,wav文件标志:WAVE    
    char            formatType[4];  //4byte,波形文件标志:FMT(最后一位空格符)    
    unsigned int    formatSize;     //4byte,音频属性(compressionCode,numChannels,sampleRate,bytesPerSecond,blockAlign,bitsPerSample)所占字节数
    unsigned short  compressionCode;//2byte,格式种类(1-线性pcm-WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM)
    unsigned short  numChannels;    //2byte,通道数
    unsigned int    sampleRate;     //4byte,采样率
    unsigned int    bytesPerSecond; //4byte,传输速率
    unsigned short  blockAlign;     //2byte,数据块的对齐,即DATA数据块长度
    unsigned short  bitsPerSample;  //2byte,采样精度-PCM位宽
    char            dataType[4];    //4byte,数据标志:data
    unsigned int    dataSize;       //4byte,从下个地址到文件结尾的总字节数,即除了wav header以外的pcm data length
}WAV_DATA_HEAD;

class CFileManage
{
     
    public:
        CFileManage();
        ~CFileManage();
        int OpenFile(char const *pName);
        int OpenFile(void);
        void CloseFile(void);
        int Write(void *pIn, uint32_t size, bool bUser, uint32_t offset);
        int Read(void *pOut, uint32_t size, bool bUser, uint32_t offset);

    /* 扩展 */
    public:
        int WavUpdateHead(int sampleRate, int bitWidth, int chanNum, int totalSize);

    private:
        FILE *mpFd;
};

#endif /* TEST */

#ifdef FILTE_MANAGE_TEST

/************************************************************
* Function : CFileManage.CFileManage
* brief    : 
* args[in] : 
* args[out]: 
* return   : 
*************************************************************/
CFileManage::CFileManage()
{
     
    mpFd = NULL;
}

/************************************************************
* Function : CFileManage.~CFileManage
* brief    : 
* args[in] : 
* args[out]: 
* return   : 
*************************************************************/
CFileManage::~CFileManage()
{
     
    CloseFile();
    mpFd = NULL;
}

/************************************************************
* Function : CFileManage.OpenFile
* brief    : 自动按文件序号创建文件
* args[in] : 
* args[out]: 
* return   : 
*************************************************************/
int CFileManage::OpenFile(void)
{
     
    int ret = 0;
    struct dirent *dp = NULL;
    char *pChr = NULL;
    mode_t mode = 0;
    uint16_t fileID = 0;
    char fileName[50];
    DIR *pDir = NULL;
    
    if (mpFd != NULL)
    {
     
        log_print(LOG_LEVEL_ERROR, "Param err!\n");
        return FILEMANAGE_ERR_INVALID_PARAM;
    }
    
    /* 检测目录是否存在 */
    ret = access(FILEMANAGE_PATH, F_OK);
    if(ret != 0)
    {
     
        /* 不存在则创建新目录 */
        mode = umask(0);
        mkdir(FILEMANAGE_PATH, 0777);
        umask(mode);
        sleep(1);  //等待文件创建,否则有概率导致文件流读取失败
    }
    
    /* 获取目录下的文件流 */
    pDir = opendir(FILEMANAGE_PATH);
    if (pDir == NULL)
    {
     
        log_print(LOG_LEVEL_ERROR, "opendir Err!%s\n", strerror(errno));
        return FILEMANAGE_ERR_NULL_POINTER;
    }
    
    /* 轮询文件流 */
    sprintf(fileName, FILEMANAGE_FILE_HEAD);
    while(1)
    {
     
        /* 获取一个文件指针 */
        dp = readdir(pDir);
        if (dp == NULL)
        {
     
            /* 文件流结尾退出循环 */
            break;
        }
        
        /* 检查文件名 */
        pChr = strstr(dp->d_name, fileName);
        if ((pChr == NULL) || (pChr != dp->d_name))
        {
     
            /* 找不到"test_"字符串,或返回指针不是文件名的头指针,判断为其他文件跳过 */
            continue;
        }
        pChr = pChr + strlen(fileName); /* 指向文件ID号 */
        
        /* 获取最大文件id */
        if (atoi(pChr) >= fileID)
        {
     
            fileID = atoi(pChr);
        }        
    }

    fileID++; //即将创建的新文件id

    sprintf(fileName, "" FILEMANAGE_PATH "" FILEMANAGE_FILE_HEAD "%d", fileID); //编译器要求字符串宏前后加空格
    mpFd = fopen(fileName, "wb+");
    if (mpFd == NULL)
    {
     
        log_print(LOG_LEVEL_ERROR, "fopen Err!%s\n", strerror(errno));
        return FILEMANAGE_ERR_OPEN_FILE_FAILE;
    }

    return FILEMANAGE_ERR_OK;
}

/************************************************************
* Function : CFileManage.OpenFile
* brief    : 按文件名打开或创建文件
* args[in] : 
* args[out]: 
* return   : 
*************************************************************/
int CFileManage::OpenFile(char const *pName)
{
     
    int ret = 0;
    mode_t mode = 0;
    char fileName[50];

    if ((pName == NULL) || (mpFd != NULL))
    {
     
        log_print(LOG_LEVEL_ERROR, "Param err!\n");
        return FILEMANAGE_ERR_INVALID_PARAM;
    }
    
    /* 检测目录是否存在 */
    ret = access(FILEMANAGE_PATH, F_OK);
    if(ret != 0)
    {
     
        /* 不存在则创建新目录 */
        mode = umask(0);
        mkdir(FILEMANAGE_PATH, 0777);
        umask(mode);
        sleep(1);  //等待文件创建,否则有概率导致文件流读取失败
    }

    sprintf(fileName, "" FILEMANAGE_PATH "" FILEMANAGE_FILE_HEAD "%s", pName);//编译器要求字符串宏前后加空格
    mpFd = fopen(fileName, "wb+");
    if (mpFd == NULL)
    {
     
        log_print(LOG_LEVEL_ERROR, "fopen Err!%s\n", strerror(errno));
        return FILEMANAGE_ERR_OPEN_FILE_FAILE;
    }
    
    log_print(LOG_LEVEL_INFO, "fopen OK! path:%s\n", fileName);

    return FILEMANAGE_ERR_OK;
}

/************************************************************
* Function : CFileManage.CloseFile
* brief    : 
* args[in] : 
* args[out]: 
* return   : 
*************************************************************/
void CFileManage::CloseFile(void)
{
     
    if (mpFd != NULL)
    {
     
        fclose(mpFd);
    }

    return;
}

/************************************************************
* Function : CFileManage.Write
* brief    : 写入数据
* args[in] : pIn 数据指针
* args[in] : size 写入大小
* args[in] : bUser 是否使能自定义写入位置
* args[in] : offset 自定义写入位置偏移
* args[out]: 
* return   : 
*************************************************************/
int CFileManage::Write(void *pIn, uint32_t size, bool bUser, uint32_t offset)
{
     
    size_t ret = 0;
    
    if ((pIn == NULL) || (size == 0) || (mpFd == NULL))
    {
     
        log_print(LOG_LEVEL_ERROR, "Param err!\n");
        return FILEMANAGE_ERR_INVALID_PARAM;
    }

    if (bUser == true)
    {
     
        fseek(mpFd, offset, SEEK_SET);
    }

    ret = fwrite(pIn, 1, size, mpFd);
    if (ret != size)
    {
     
        log_print(LOG_LEVEL_ERROR, "Err!%s\n", strerror(errno));
        return FILEMANAGE_ERR_PROCESS_FAILED;
    }

    fflush(mpFd);
    
    if (bUser == true)
    {
     
        fseek(mpFd, 0, SEEK_END);
    }

    return FILEMANAGE_ERR_OK;
}

/************************************************************
* Function : CFileManage.Read
* brief    : 
* args[in] : pOut 输出数据指针
* args[in] : size 读取大小
* args[in] : bUser 是否使能自定义读取位置
* args[in] : offset 自定义读取位置偏移
* args[out]: 
* return   : 
*************************************************************/
int CFileManage::Read(void *pOut, uint32_t size, bool bUser, uint32_t offset)
{
     
    size_t ret = 0;
    
    if ((pOut == NULL) || (size == 0) || (mpFd == NULL))
    {
     
        log_print(LOG_LEVEL_ERROR, "Param err!\n");
        return FILEMANAGE_ERR_INVALID_PARAM;
    }

    if (bUser == true)
    {
     
        fseek(mpFd, offset, SEEK_SET);
    }

    ret = fread(pOut, 1, size, mpFd);
    if (ret != size)
    {
     
        log_print(LOG_LEVEL_ERROR, "Err!%s\n", strerror(errno));
        return FILEMANAGE_ERR_PROCESS_FAILED;
    }
    
    return FILEMANAGE_ERR_OK;
}

/************************************************************
* Function : CFileManage.WavUpdateHead
* brief    : 
* args[in] : 
* args[out]: 
* return   : 
*************************************************************/
int CFileManage::WavUpdateHead(int sampleRate, int bitWidth, int chanNum, int totalSize)
{
     
    WAV_DATA_HEAD pcm2wavHEAD = {
     0};
    int err = FILEMANAGE_ERR_OK;
    
    memcpy(pcm2wavHEAD.riffType, "RIFF", strlen("RIFF"));
    memcpy(pcm2wavHEAD.wavType, "WAVE", strlen("WAVE"));
    pcm2wavHEAD.riffSize            = 36 + totalSize;
    pcm2wavHEAD.sampleRate          = sampleRate;
    pcm2wavHEAD.bitsPerSample       = bitWidth;
    memcpy(pcm2wavHEAD.formatType, "fmt ", strlen("fmt "));
    pcm2wavHEAD.formatSize          = 16;
    pcm2wavHEAD.numChannels         = chanNum;
    pcm2wavHEAD.blockAlign          = 4;
    pcm2wavHEAD.compressionCode     = 1;
    pcm2wavHEAD.bytesPerSecond      = sampleRate * bitWidth  / 8u * chanNum;
    memcpy(pcm2wavHEAD.dataType, "data", strlen("data"));
    pcm2wavHEAD.dataSize            = totalSize;

    err = Write(&pcm2wavHEAD, sizeof(pcm2wavHEAD), true, 0);
    if (err != FILEMANAGE_ERR_OK)
    {
     
        log_print(LOG_LEVEL_ERROR, "Err!%s\n", strerror(errno));
        return FILEMANAGE_ERR_PROCESS_FAILED;
    }

    return err;
}


#endif /* TEST */

你可能感兴趣的:(C,c++)