linux上使⽤open读取⼀个⼆进制⽂件
在实际项⽬中⽤到了⼆进制⽂件的读取功能,就彻底研究⼀下。我们只注意read整个⼆进制⽂件有没有问题,⽽不关⼼效率和时间。看下⾯的代码,注意⼏点:
2.while循环有两个结束条件,1)刚好read的第三个参数是整个⽂件的整数倍,2)不是整数倍则需要⾃⼰加判读。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
int ReadBinaryFile(const char* _fileName, void* _buf, int _bufLen);
int WriteBinaryFile(const char* _fileName, void* _buf, int _bufLen);
int main(int argc, char *argv[])
{linux怎么读取文件
if(argc < 2)
{
printf("main argc < 2\r\n");
exit(0);
}
printf("input file=%s\n", argv[1]);
int nReadnum = 512;
int nfilenum = 512;
int nReadretnum = 0;
unsigned char sendBuffer[512];
int fp;// * fp = NULL;
fp = open(argv[1], O_RDONLY); // 必须确保是以 ⼆进制写⼊的形式打开
if( NULL == fp )
{
return (-1);
}
int read_num = 0;
while(1)
{
printf("=0=fread nReadnum=%d\n", nReadnum);
nReadretnum = read(fp, &sendBuffer, nReadnum); // nReadretnum有可能⼩⾬512
printf("=1=fread nReadretnum=%d nfilenum=%d read_num=%d\n", nReadretnum, nfilenum, read_num);
if(nReadretnum != 0)
{
read_num ++;
printf("=11=fread nReadretnum=%d\n", nReadretnum);
WriteBinaryFile("./1.h264", sendBuffer, nReadretnum);
WriteBinaryFile("./1.h264", sendBuffer, nReadretnum);
if(nReadretnum != nReadnum)
break;
}
else
{
printf("=121=fread nReadretnum=%d\n", nReadretnum);
break;
}
printf("=2=fread nReadretnum=%d\n", nReadretnum);
}
close(fp);
// fromLen = sizeof(fromAddr);
// if(recvfrom(sock,sendBuffer,128,0,(struct sockaddr*)&fromAddr,&fromLen)<0) // {
// printf("()recvfrom() error\r\n");
// close(sock);
// exit(1);
// }
// printf("recvfrom() result:%s\r\n",sendBuffer);
return 0;
}
/*
* 函数说明: 写⼆进制⽂件
* 参数描述: _fileName, ⽂件名称
*          _buf, 要写的内存缓冲。
*          _bufLen, 内存缓冲的长度
*  返回值: 0, 成功
*          -1, 失败
*
*/
int WriteBinaryFile(const char* _fileName, void* _buf, int _bufLen)
{
FILE * fp = NULL;
if( NULL == _buf || _bufLen <= 0 ) return (-1);
fp = fopen(_fileName, "ab+"); // 必须确保是以 ⼆进制写⼊的形式打开
if( NULL == fp )
{
return (-1);
}
fwrite(_buf, _bufLen, 1, fp); //⼆进制写
fclose(fp);    fp = NULL;
return 0;    }

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。