Qt04-文件IO流读写

一、对话框读写文件

读文件

  1. 需要导入的头文件
  2. 使用QFileDilog读取文件的路径,初始化文件读取的对象,设置文件的读取的方式,将读取的内容存入到ByteArray数组中
    // 参数: 指定父对象,文件操作方式,文件路径,限制打开的文件类型
    QString path = QFileDialog::getOpenFileName(this, "open", "../", "TXT(*.txt)");
    
    if(path.isEmpty() == false){
        // 文件对象
        QFile file(path);
    
        // 打开文件
        bool isOk = file.open(QIODevice::ReadOnly); // 以只读的方式打开
        if(isOk == true){
            // 读取文件内容,全部存储到字节数组中, 默认只识别utf-8的编码
            QByteArray array = file.readAll();
            // 显示到编辑区
            // 可以使用QString(byteArray)将arrayy转换,也可以直接写入到text中可以自动转换
            ui->textEdit->setText(array);
        }
    
        file.close();   // 最后需要关闭文件
    }
    
  3. 通过指针的方式读取每一行数据
       if(isOk == true){
          QByteArray array;
          while(file.atEnd() == false){
              // 读取一行数据
              array  += file.readLine();    //readLine默认读取最大值
          }
    
          ui->textEdit->setText(array);
    	}
    

写文件

void Widget::on_pushButton_2_clicked()
{
    QString path = QFileDialog::getSaveFileName(this, "save", "../", "TXT(*.txt)");
    if(path.isEmpty() == false){
        QFile writeFile;    //创建写文件对象
        writeFile.setFileName(path);    // 关联文件名字

        // 以只写的方式打开文件
        bool isOk = writeFile.open(QIODevice::WriteOnly);
        if(isOk == true){
            // 获取编辑区的内容
            QString str = ui->textEdit->toPlainText();

#if 0
            // 写文件,需要以utf-8的编码格式写入
            // QString->QByteArray
            writeFile.write(str.toUtf8());
#endif

#if 0
            // 第二种写入的方式
            // QString -> c++ string ->char *
            writeFile.write(str.toStdString().data());
#endif

            // QString -> QByteArray
            QString str = "123";
            QByteArray a = str.toUtf8();
            a = str.toLocal8Bit();  // 转换为本地编码


            // QbyteArray -> char*
            char *b = a.data();

            // char* -> QString
            char *p = "abc";
            QString c = QString(p);
        }

        writeFile.close();
    }

}

二、获取文件的信息 Info

需要导入头文件 QFileInfo QDateTime(格式化输出时间)

#if 1        // 获取文件的信息
    QFileInfo info(path);
    qDebug() << "文件名字 :" << info.fileName();
    qDebug() << "文件后缀 :" << info.suffix();
    qDebug() << "文件大小 :" << info.size();

    // 导入头文件 QDateTime 可以设定日期的输出格式
    qDebug() << "文件创建时间 :" << info.created().toString("yyyy-MM-dd hh:mm:ss.zzz");
#endif

三、QDataStream 读写文件-(二进制读取文件)

以二进制( 流 )的方式读取文件
小技巧: qDebug() 可以使用 #define写为cout, 使用宏可以输出所在的文件和行数

// __FILE__ 打印所在文件  __LINE__打印所在行号
#define cout qDebug() << "[" << __FILE__ << ":" << __LINE__ << "]"


void Widget::writeDate(){
    // 创建文件对象
    QFile file("../test.txt");

    // 打开文件,以只写的方式
    bool isOK = file.open(QIODevice::WriteOnly);
    if(true == isOK){
        // 创建数据流,和file文件关联,
        QDataStream stream(&file);

        // 这样给数据流中输入数据就相当于往文件中输入数据
        stream << QString("主要看气质") << 250;
    }

    file.close();
}


void Widget::readDate(){
    QFile file("../test.txt");

    // 打开文件,以只读的方式
   bool isOK = file.open(QIODevice::ReadOnly);
   if(true == isOK){
       QDataStream stream(&file);
       // 读的时候以写的顺序读取
       QString str;
       int a;

       stream >> str >> a;

       cout << str << a;

       file.close();
   }
}

四、QTextStream操作文件-文本方式(读写的时候可以指定编码)

void Widget::writeTextData(){
    QFile file;
    file.setFileName("../textDemo.txt");

    bool isOK = file.open(QIODevice::WriteOnly);
    if(isOK == true){
        // 关联文件
        QTextStream stream(&file);

        // 指定编码
        stream.setCodec("UTF-8");

       stream << QString("天气真好") << 1223;

       file.close();
    }
}

void Widget::readTextData(){
    QFile file;
    file.setFileName("../textDemo.txt");

    bool isOK = file.open(QIODevice::ReadOnly);
    if(isOK == true){
        // 关联文件
        QTextStream stream(&file);

        // 指定读取的编码格式
        stream.setCodec("UTF-8");
        QString str;
        int num;

        str = stream.readAll();

        file.close();
    }
}

五、QBuffer 内存存储内容

将内容存储到内存中,也可以指定存储到 QByteArray中 (需要导入头文件 QBuffer)

	void Widget::bufferData(){
	    QBuffer memWrite;
	    memWrite.open(QIODevice::WriteOnly);
	    QDataStream stream(&memWrite);
	    stream << QString("测试") << 250;
	    memWrite.close();
	
	    memWrite.open(QIODevice::ReadOnly);
	    QDataStream in;
	    in.setDevice(&memWrite);
	    QString str;
	    int a;
	    in >> str >> a;
	    memWrite.close();
	
	    cout << str << a;
	}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Linux 上,可以通过文件系统访问 I/O 端口,但需要使用特定的设备驱动程序。在 Qt 中,可以通过 QIODevice 类来访问设备驱动程序。 以下是一个使用 QIODevice 类 I/O 端口的示例代码: ```cpp #include <QtCore> #include <sys/io.h> class IoDevice : public QIODevice { public: IoDevice(quint16 port, QObject* parent = nullptr) : QIODevice(parent), m_port(port) { if (ioperm(m_port, 1, 1) != 0) { qFatal("ioperm failed"); exit(1); } } ~IoDevice() { ioperm(m_port, 1, 0); } protected: qint64 readData(char* data, qint64 maxSize) override { unsigned char ch = inb(m_port); *data = ch; return 1; } qint64 writeData(const char* data, qint64 maxSize) override { unsigned char ch = *data; outb(ch, m_port); return 1; } private: quint16 m_port; }; int main(int argc, char** argv) { QCoreApplication app(argc, argv); IoDevice ioDevice(0x378); if (!ioDevice.open(QIODevice::ReadWrite)) { qFatal("Failed to open I/O device"); exit(1); } char data; if (ioDevice.read(&data, 1) == 1) { qDebug() << "Read data:" << data; } char sendData = 0x55; if (ioDevice.write(&sendData, 1) == 1) { qDebug() << "Write data:" << sendData; } ioDevice.close(); return app.exec(); } ``` 上述示例代码中,我们创建了一个名为 `IoDevice` 的自定义 `QIODevice` 类。在构造函数中,我们使用 `ioperm` 函数请求访问 I/O 端口。在析构函数中,我们释放了对 I/O 端口的访问。在 `readData` 和 `writeData` 函数中,我们分别使用 `inb` 和 `outb` 函数 I/O 端口。在 `main` 函数中,我们创建了 `IoDevice` 类的实例,并使用 `open` 函数打开 I/O 端口。然后,我们使用 `read` 函数取一个字节的数据,并使用 `write` 函数入一个字节的数据。最后,我们关闭了 `IoDevice` 类的实例。 需要注意的是,访问 I/O 端口需要特权级别较高的权限,因此需要使用 root 权限运行程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值