linux上使用open读取一个二进制文件

在实际项目中用到了二进制文件的读取功能,就彻底研究一下。我们只注意read整个二进制文件有没有问题,而不关心效率和时间。

看下面的代码,注意几点:

1.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[])
{
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);
  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;    
}

Linux环境下,Qt提供了一种处理大文件的方式,特别是当需要存储超过4GB的二进制数据时,可以利用其QDataStream或QLocalFile等工具。以下是使用Qt处理大文件的一些步骤: 1. **使用QDataStream**: - 首先,你需要包含`<qiodev>`头文件,它包含了`QIODevice`、`QDataStream`等类。 - 创建一个`QIODevice`实例,比如`QFileDevice`,它可以打开文件进行读写,包括大文件。 - 使用`QDataStream`对设备进行操作,可以将大的二进制数据分成多个小块逐个写入,例如: ```cpp QByteArray buffer; QDataStream out(device, QIODevice::WriteOnly); while (/*根据需要读取的数据大小循环*/) { out << data; // 将数据写入buffer,然后写入设备 // 如果缓冲区满了或者达到某个进度点,可以选择保存并清空缓冲区 } ``` 2. **使用QLocalFile**: `QLocalFile`提供了本地文件的跨平台访问,支持大文件。创建`QLocalFile`对象,并设置其路径,然后像操作普通文件一样操作,但是会在磁盘上自动管理分块。 3. **内存映射文件(Memory-Mapped File)**: 另一种处理大文件的方法是内存映射,通过系统提供的API将文件的一部分映射到进程的地址空间,这允许你在程序里直接操作文件内容。你可以使用`QMap`或`QByteArray`来映射文件,注意操作完成后记得解除映射。 ```cpp QLocalFile file("largefile.dat"); if (!file.open(QIODevice::ReadOnly | QIODevice::Unmap)) { // 处理错误 } QByteArray mappedData = file.map(); // 现在可以直接操作mappedData,但它是在内存中而不是硬盘上 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值