1、QString,QByteArray,char * 之间的转换

(1) QString -> QByteArray
 
 QString str = "123";
 QByteArray byteArray = str.toUtf8(); // 中文
 byteArray = str.toLocal8Bit();       // 本地编码
 
(2) QByteArray -> char *
 
 char *pc = byteArray.data();
 
(3) char * -> QString
 
 char *pc = "abc";
 QString qstr = QString("%1").arg(pc);



2. 小文件文件的读写

2.1 读取文件中所有的数据


QString fileName = QString("%1").arg("D:/01.txt");
     QFile file(fileName); // fileName文件的路径
     if(file.open(QIODevice::ReadOnly))  // 以读写的方式打开文件
     {
         return ;    
     }
     QByteArray data = file.readAll();  // 方式1. 将文件的数据全部读取出来
   
     int fileSize = file.size();        // 获取文件的长度(单位:字节)
     data = file.read(fileSize);        // 方式2. 将文件的所有数据读取出来
     // 从指定的位置开始读取
     file.seek(100) // 这是设置从100的位置读取
     data = file.read(1000) // 从100的位置读取1000个字节
     file.close();                      // 使用完毕把文件关闭


2.2 一行一行的读取文件的数据

QString fileName = QString("%1").arg("D:/01.txt");
     QFile file(fileName); // fileName文件的路径
     if(file.open(QIODevice::ReadOnly))  // 以读的方式打开文件
     {
         return ;
     }
     while(!file.atEnd()) // 判断文件是否结束
     {
         // 每读取一行数据,游标seek会自动往下跳,所以当seek到达末尾是atEnd()返回true
         QByteArray data =  file.readLine();  
     }
     file.close();

2.3 将数据写入文件中


QString fileName = QString("%1").arg("D:/01.txt");
     QFile file(fileName); // fileName文件的路径
     if(file.open(QIODevice::WriteOnly))  // 以写的方式打开文件
     {
         return ;
     }
    QByteArray data;
    data.resize(10);
    memset(data.data(),0x00,data.size());
    file.write(data);
    file.close();


2.4 通过内存映射读写文件


uchar *QFileDevice::map(qint64 offset, qint64 size, MemoryMapFlags flags = NoOptions)


        ① 从offset开始将文件大小字节映射到内存中。为了使映射成功,应该打开一个文件,但在映射内存之后,文件不需要保持打开状态。当QFile被销毁或使用此对象打开一个新文件时,任何未被取消映射的映射将自动取消映射。
         ② 映射将具有与文件相同的打开模式(读和/或写),除非使用MapPrivateOption,在这种情况下,总是可以写入映射的内存。
        ③ 返回一个指向内存的指针,如果有错误则返回0。

QString fileName = QString("%1").arg("D:/01.txt");
     QFile file(fileName); // fileName文件的路径
     if(file.open(QIODevice::WriteOnly))  // 以写的方式打开文件
     {
         return ;
     }
     uchar* pfile = file.map(0, file.size());  //  返回一个指向内存的指针,如果有错误则返回0
     if(pfile)
     {
         // do work 
         // memcpy(pfile,data.data(),size); // 写入数据
         // memcpy(data.data(),pfile,size); // 读取数据
         file.unmaps(pfile); // 取消映射 其实QFile对象被摧毁或者打开一个新的文件会自动取消映射
     }
     file.close();


3、 大文件的读写

3.1 将大文件所有拆成一块一块的读写。


QString fileName = QString("%1").arg("D:/01.txt");
     QFile file(fileName); // fileName文件的路径
     if(file.open(QIODevice::WriteOnly))  // 以写的方式打开文件
     {
         return ;
     }
     qint64 fileSize = file.size(); // 文件的长度
     int readSize = 1024*1024 ;  // 每一次读取的数据长度,可以自由设置
     // file.pos()获取文件游标的位置
     while(!file.atEnd())  
     {
         QByteArray data = file.read(readSize);
     } 
     file.close();


3.2. 将大文件所有拆成一行一行的读写。


QString fileName = QString("%1").arg("D:/01.txt");
     QFile file(fileName); // fileName文件的路径
     if(file.open(QIODevice::WriteOnly))  // 以写的方式打开文件
     {
         return ;
     }
     while(!file.atEnd())  
     {
         QByteArray data = file.readLine();
     } 
     file.close();