1.
FILE *fout = Null;
//这样打开时 就是把原文件中的内容清掉了。
if ((fout = fopen(pFile, "w+")) != NULL)
{
PR("");
//DPRINTHEX("buffer", buffer, size);
fprintf(fout, "%s\n", buffer);//字符串末端加换行
fclose(fout);
return DEF_TRUE_1;
}
else
{
fclose(fout); 空指针不用释放 == 改为 == 》//fclose(fout);
return DEF_FAIL_1;
}
2.
sndfd = open(DEF_DEV_WAVE, O_WRONLY);
if (sndfd < 0)
{
_printf("open %s fail", DEF_DEV_WAVE);
perror("\r\n open /dev/xx fail");
sndfd = open(DEF_DEV_WAVE_2416, O_WRONLY);
if (sndfd < 0)
{
_printf("open %s fail", DEF_DEV_WAVE_2416);
perror("\r\n open /dev/xx fail");
fclose(fwave);
vPrtSmartDevModuleRunLog(__FUNCTION__, __LINE__, "exit() ", NULL, 0, CardModuleLog, CardModuleLogBak);
usleep(100 * 1000);
return;
}
}
fread(&fmt_chunk, 1, sizeof(struct Chunk_Header), fwave);
if (!strncmp(fmt_chunk.Chunk_ID, "fmt ", 4))
{
/* this is a fmt chunk */
fread(&wavfmt, 1, sizeof(struct Wave_Format), fwave);
arg = wavfmt.BitsPerSample;
status = ioctl(sndfd, SOUND_PCM_WRITE_BITS, &arg);
if (status == -1)
perror("SOUND_PCM_WRITE_BITS ioctl failed");
if (arg != wavfmt.BitsPerSample)
perror("unable to set sample size");
_printf("BitsPerSample=0x%x = %d", wavfmt.BitsPerSample, wavfmt.BitsPerSample);
arg = wavfmt.NumChannels;
status = ioctl(sndfd, SOUND_PCM_WRITE_CHANNELS, &arg);
if (status == -1)
perror("SOUND_PCM_WRITE_CHANNELS ioctl failed");
if (arg != wavfmt.NumChannels)
perror("unable to set number of channels");
if (u1WaveNo >= DEF_WAVE_OTHER_START)
{
arg = wavfmt.SampleRate / 2;
}
else
{
arg = wavfmt.SampleRate / 1;
}
status = ioctl(sndfd, SOUND_PCM_WRITE_RATE, &arg);
if (status == -1)
perror("SOUND_PCM_WRITE_WRITE ioctl failed");
_printf("SampleRate=0x%x = %d \r\n", arg, arg);
/* skip extra bytes */
fseek(fwave, fmt_chunk.Chunk_Size - 16 + fmt_chunk.Chunk_Size % 2, SEEK_CUR);
}
else
{
_fprintf("Can't find fmt chunk.\n");
fclose(fwave);
== 改为 == 》close(sndfd);//忘记了释放,导致资源泄露
vPrtSmartDevModuleRunLog(__FUNCTION__, __LINE__, "exit() ", NULL, 0, CardModuleLog, CardModuleLogBak);
usleep(100 * 1000);
return;
}
3.
int getWavePath(unsigned char u1WaveNo, u8* u1aWavePath)
{
switch (u1WaveNo)//播放哪一首歌曲
{
......
default:
memset(u1aWavePath, 0, sizeof(u1aWavePath)); == 改为 == 》*u1aWavePath = NULL;//原本的意思是要清空数组形式字符串的内容,但是形参传递的是指针,用memset清空的是sizeof大小4个字节的内容。
return -1;
break;
}
return 1;
}
4.
int _SZT_Init_Environment2(unsigned char cardsn[16])
{
int iIndex = POS_COMM_TEXT;
char RtnFlag = 0xee;
u16 CommandType = DEF_CMD_SZ_0X11_INIT_MTD;
{//send
unsigned char au1SendData[512];
int iSendDataNum = 0;
PackSendData(0, 0, 0, 0, 0, 0, RtnFlag, CommandType, au1SendData, iSendDataNum, LOCAL_IP_ADDRESS, CARD_READER_MODULE_PORTNO__);
}
{//receive
unsigned char au1PtrRecvBuff[1024];
int i4RecvLenMax = sizeof(au1PtrRecvBuff);
int iRetCode = UdpRecv(1, 0, g_i4CardReaderSocketFd, au1PtrRecvBuff, i4RecvLenMax);
if (iRetCode > 0)
{
unsigned char ptrNetRecvData[MAX_NET_DATA_LEN * 2];
iRetCode = getUdpPackData(au1PtrRecvBuff, 0, iRetCode, MAX_NET_DATA_LEN, ptrNetRecvData);
if (iRetCode <= 0)
{
_printf("SZ getUdpPackData:failure! \r\n");
}
else
{
if (ptrNetRecvData[POS_COMMTYPE + 1] == CommandType)
{
if (ptrNetRecvData[iIndex++] == 0)
{
memcpy(cardsn, &ptrNetRecvData[iIndex], sizeof(cardsn)); == 错误 == 》sizeof(cardsn)的大小为sizeof指针的大小
iIndex += sizeof(cardsn); == 错误 == 》sizeof(cardsn)的大小为sizeof指针的大小
return 0;
}
else
{
return -1;
}
}
}
}
}
return -1;
}
5.
//插入数据到文件的开头
int insertFileDataHead(char *pFile, char *pCardData, u16 u2Len, char cFlag)
{
{
if (access(pFile, F_OK) != 0) /*R_OK,W_OK,X_OK 和F_OK。R_OK,W_OK与X_OK用来检查文件是否具有读取、写入和执行的权限。F_OK则是用来判断该文件是否存在*/
{
PRERR("access(%s, F_OK) != 0", pFile);
return DEF_FAIL_1;
}
int fd = DEF_FAIL_1;
unsigned int size = 0, i = 0;
unsigned char buffer[1024 * 1024];//应该动态分配内存吧
//打开文件
fd = open(pFile, O_RDONLY);
if (fd == DEF_FAIL_1)
{
PRERR("Cannot open %s", pFile);
return DEF_FAIL_1;
}
memcpy(&buffer[0], pCardData, u2Len & 0xff);
size = read(fd, &buffer[u2Len & 0xff], sizeof(buffer));
PR("%s:size=%d", pFile, size);
if ((size >= 0) && (size < (sizeof(buffer)-512)))
{
int offset = 0;
if (fseek(fd, offset, SEEK_SET) == -1)//移动到开头
{
_printf("GetUintFromFp:File FP Error!\r\n");
close(fd);
return DEF_FAIL_1;
}
else
{//写文件
//如果没有错误,则会返回实际读/写的字节数,如果有错误码,则会返回-1.
//记住一种情况,返回的实际读写数目可能跟你要读写的字节数不一致,这个是没有错的,返回0表示读写的字节为0.
u8 au1Tmp[128];
{//备份文件
snprintf(au1Tmp, sizeof(au1Tmp), "cp -rf %s %s.bak", pFile, pFile);
_system(au1Tmp);
}
size += u2Len;
int bytes_write = write(fd, buffer, size);
/* 一个致命错误发生了 */
if ((bytes_write == -1) && (errno != EINTR))
{
close(fd);
return DEF_FAIL_1;
}
else if (bytes_write == size)//写完了所有读的字节
{
close(fd);
snprintf(au1Tmp, sizeof(au1Tmp), "rm -rf %s.bak", pFile);
_system(au1Tmp);
return DEF_TRUE_1;
}
else if (bytes_write > 0)//只写了一部分,继续写
{
close(fd);
return DEF_FAIL_1;
}
}
}
<span style = "color:#000000;"> == 错误 == 》不能忘记关闭打开的文件
else
{
close(fd);
return DEF_FAIL_1;
}
}
}
6.
memcpy(&buffer[0], pCardData, u2Len & 0xff);
size = read(fd, &buffer[u2Len & 0xff], sizeof(buffer));
PR("%s:size=%d", pFile, size);
if ((size >= 0) && (size < (sizeof(buffer)-512)))
{
int offset = 0;
if (fseek(fd, offset, SEEK_SET) == -1)//移动到开头
{
_printf("GetUintFromFp:File FP Error!\r\n");
== 改为 == 》close(fd);//忘记了释放,导致资源泄露
return DEF_FAIL_1;
}