QT--读取/生成txt文件

本文为学习记录,若有错误,请联系作者,谦虚受教。


前言

你看我越是穷途末路 就越是势如破竹.

说明

第一种方法是从QTextedit 窗口中导出txt文件。
第二种方法是在程序执行过程中,打印日志,导出txt文件。

一、生成txt文件

1.h文件

在头文件中需要添加QFile头文件

#include<QFile>
#include<QTextStream>
#include<QFileDialog>
// QTextStream是一个非常强大的类,它可以对IO设备,QString,QByteArray等类进行方便的读写操作
//QFileDialog 是Qt 中用于文件打开和保存的对话框

public:
    QFile file;

2.cpp文件

目的:点击一个按键时,将窗口显示的内容以文本形式保存下来。保存在自己设定的路径中。
.cpp文件代码如下

//保存窗口
void MainWindow::on_savetext_recv_clicked()
{
    //选择保存路径
    QString textfileName = QFileDialog::getOpenFileName(this, tr("save text"),
                                                     "",
                                                     tr("text(*.txt)"));
    QFile file(textfileName);
    if(!file.open(QFile::WriteOnly|QFile::Text))
    {
        QMessageBox::information(this,"警告","请选择正确的文件!");
        return;
    }
    QTextStream out(&file);  //QTextStream会自动将 Unicode 编码同操作系统的编码进行转换
    out<<ui->text_recv->toPlainText();
}

在这里插入图片描述

二、生成log文件

调用


    QString strLog = "" , strTemp;
    strLog += "发送数据:";
    for(int i=0;i<sendLen;i++)
    {
        strTemp.sprintf("%02X",sendBuf[i]);
        strLog += strTemp + " ";
    }
    strLog += "\r\n";
    strLog += "接收数据:";
    for(int i=0;i<ralen;i++)
    {
        strTemp.sprintf("%02X",rcvBuff[i]);
        strLog += strTemp + " ";
    }
    SaveLogTxt(strLog);
    

导出的文件默认保存在程序.exe的绝对路径下。

void CusProtocol::SaveLogTxt(QString error)
{
    QDateTime currenttime = QDateTime::currentDateTime();
    QString strDate = currenttime.toString("yyyy-MM-dd");
    QString strTime =currenttime.toString(" hh:mm:ss");
    QString path = QCoreApplication::applicationDirPath();
    QString strPath = path + strDate + "log.txt";
    QFile file(strPath);
    bool isOK = file.open(QIODevice::WriteOnly|QIODevice::Append);
    if(isOK)
    {
        QTextStream stream(&file);
        stream<<strDate<<strTime<<"\r\n";
        stream<<error<<"\r\n";
    }
    file.close();
}

在这里插入图片描述

三、删除log文件

//删除日志
void CRunThread::ClearLogData()
{
    //1.获取当前日期
    QDateTime currenttime = QDateTime::currentDateTime();
    QString strDate = currenttime.toString("yyyy-MM-dd");
    //2.获取文件夹路径,遍历文件夹
    QString path = QCoreApplication::applicationDirPath();

    QString logPath = path ;
    QStringList foldernames;
    QStringList filters;
    filters << "*.txt";
    QDir dir(logPath);
    //搜索当前目录符合条件的文件
    foreach(QString file, dir.entryList(filters, QDir::Files))
        foldernames += logPath + '/' + file;
    //QFileInfoList fileList = dir.entryInfoList();//当前文件夹下只有日志文件,也可以直接获取全部文件
    //3.比较日期
    if (foldernames.size() > 5)
    {
        foreach(QString fileName, foldernames)
        {
            //获取文件的创建时间
            QFileInfo info(fileName);
            QDateTime dt = info.created();//获取文件创建时间
            qint64 days = dt.daysTo(currenttime);//获取文件相对于当前时间的天数
            if (days > 5)
            {
                QFile::remove(fileName);//大于5天,移除文件
            }
        }
    }
}

四、文件夹文件数量

 m_Work.m_strTxtFilePath = QFileDialog::getExistingDirectory(
                this, "choose src Directory",
                 "/");

    //获取文件夹数量
    QString folderpath = "文件夹路径";
    QDir *dir = new QDir(m_Work.m_strTxtFilePath);
    QStringList filter;
    QFileInfoList fileInfoList = dir->entryInfoList(filter);
    m_Work.m_FileNum = fileInfoList.count()-2;

五、读取文件

QDir dir(m_strTxtFilePath);
    QStringList nameFilters;
    nameFilters << "*.TXT" ;
    //获取名字
    QStringList files = dir.entryList(nameFilters, QDir::Files | QDir::Readable, QDir::Name);

    QList<QVariant> allRowData[m_FileNum];
    for (int i=0; i<m_FileNum; i++)
    {
        //   打开txt文件
        QString name = m_strNmType + "nm "+QString::number(i) +".TXT";
        QString path = m_strTxtFilePath + "/" + name;

        QFile f(path);
        if (!f.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            return;
        }

        //读取txt 流
        QTextStream txtInput(&f);
        int numK = 0;
        //QList<QVariant> allRowData;
        while (!txtInput.atEnd())
        {
            //读取每一行的数据
            numK++;
            QString lineStr;
            QStringList linedata;
            lineStr = txtInput.readLine();
            //	astr.append(lineStr);
            //根据空格来分成多个数据
            linedata = lineStr.split(" ");

            /*	while (!linedata.isEmpty())
                    {
                        aRowData.append((linedata.front()));
                        linedata.pop_front();
                    }*/
            //将多个数据转为QVariant类型(这个是qt的任意类型)
            allRowData[i].append(QVariant(linedata));
        }
    }

    

六、生成表格

//写入excel
    QFile file(m_strDirFilePath);
    bool isOK = file.open(QIODevice::WriteOnly | QIODevice::Append);
    if(!isOK) return;
    QString strW = "",strTemp ="";
    QTextStream out(&file);
    out.setCodec("utf-8");

    //首行
    out << tr("波长") << "\t" ;
    for(int i=0; i<m_FileNum;i++)
    {
        out <<QString::number(i) << "\t";
    }
    out << "\r\n";

    int NUM = allRowData[0].size();
    for(int it =0; it<NUM; it++)
    {
        QString strAll = "";
        for(int i=0; i<m_FileNum; i++)
        {
            qDebug()<<i;
            strTemp = allRowData[i][it].toString();
            if(i == 0)
            {
                strAll += allRowData[i][it].toString() + "\t";
            }
            else {
                QStringList INFO = strTemp.split("\t");
                strAll += INFO[1];
                strAll += "\t";
            }
        }
        out << strAll << "\r\n";
    }
    file.close();

七、读取文件夹内文件名

/********************************************************
输入:文件路径;保存全部文件名的容器
/********************************************************/
void findFile(const QString& path, std::vector<QString>& fileNames)
{
    QDir dir(path);
    if(!dir.exists())
    {
        return;
    }
 
    //获取filePath下所有文件夹和文件
    dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);//文件夹|文件|不包含./和../
 
    //排序文件夹优先
    dir.setSorting(QDir::DirsFirst);
 
    //获取文件夹下所有文件(文件夹+文件)
    QFileInfoList list = dir.entryInfoList();
 
    /**********直接获取带文件后缀的文件;如果使用,则只搜索当前文件夹下的文件*************
    QStringList filer;
    filer << "*.jpg" <<"*.bmp";//设定需要的文件类型(*为所有类型)
    QFileInfoList list = dir.entryInfoList(filer);
    //QList<QFileInfo> *list= new QList<QFileInfo>(dir.entryInfoList(filter));
    /*******************************************************************************/
    
    /**********************只获取文件,只搜索当前文件夹下的文件************************
    QStringList list= dir.entryList(filer, QDir::Files | QDir::NoDotAndDotDot);
    /*******************************************************************************/
    
    if(list.size() == 0)
    {
        return;
    }
 
    //遍历
    for(int i = 0; i < list.size(); i++)
    {
        QFileInfo fileInfo = list.at(i);
 
        if(fileInfo.isDir())//判断是否为文件夹
        {
            findFile(fileInfo.filePath(), fileNames);//递归开始
        }
        else
        {
            if(fileInfo.suffix() == "bmp")//设定后缀
            {
                fileNames.emplace_back(list.at(i).fileName());//保存全部文件名
                //fileNames.emplace_back(list.at(i).filePath());//保存全部文件路径+文件名
            }
        }
    }
}

总结

善于总结,多进一步。

在认清生活真相之后请你依然热爱生活

  • 11
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值