QT学习笔记(11) 读写文件

一、QT的文件系统的类之间的关系

二、文件的读写

  (1)通过QFile读写文件

  (2)QFileInfo获取文件信息

代码如下:

mainwindow.h

 1 #ifndef MAINWINDOW_H
 2 #define MAINWINDOW_H
 3 
 4 #include <QMainWindow>
 5 
 6 namespace Ui {
 7 class MainWindow;
 8 }
 9 
10 class MainWindow : public QMainWindow
11 {
12     Q_OBJECT
13 
14 public:
15     explicit MainWindow(QWidget *parent = 0);
16     ~MainWindow();
17 
18 private slots:
19 
20     void on_buttonRead_clicked();
21 
22     void on_buttonWrite_clicked();
23 
24 private:
25     Ui::MainWindow *ui;
26 };
27 
28 #endif // MAINWINDOW_H

mainwindow.cpp

  1 #include "mainwindow.h"
  2 #include "ui_mainwindow.h"
  3 #include <QFile>
  4 #include <QFileDialog>
  5 #include <QDateTime>
  6 #include <QDebug>
  7 
  8 MainWindow::MainWindow(QWidget *parent) :
  9     QMainWindow(parent),
 10     ui(new Ui::MainWindow)
 11 {
 12     ui->setupUi(this);
 13 }
 14 
 15 MainWindow::~MainWindow()
 16 {
 17     delete ui;
 18 }
 19 
 20 void MainWindow::on_buttonRead_clicked()
 21 {
 22     QString path = QFileDialog::getOpenFileName(this,
 23                    "open","../","TXT(*.txt)");
 24     if(path.isEmpty() == false)//不为空
 25     {
 26         QFile file(path);//文件对象
 27         //打开文件,只读方式
 28         bool isOK = file.open(QIODevice::ReadOnly);
 29         if(isOK == true)
 30         {
 31 
 32             /*
 33             //读文件,默认只识别UTF8
 34             //一次性读完
 35             QByteArray array = file.readAll();
 36             //显示到编辑区
 37             ui->textEdit->setText(QString::fromLocal8Bit(array));
 38             */
 39 
 40 
 41             //一行一行读
 42             QByteArray array;
 43             while( file.atEnd() == false)
 44             {
 45                 //读一行
 46                 array += file.readLine();
 47             }
 48             //显示到编辑区
 49             ui->textEdit->setText(QString::fromLocal8Bit(array));
 50 
 51         }
 52         file.close();
 53 
 54         //获取文件信息
 55         QFileInfo info(path);
 56         qDebug() << QString::fromLocal8Bit("文件名字:") <<info.fileName();
 57         qDebug() << QString::fromLocal8Bit("文件后缀:") <<info.suffix();
 58         qDebug() << QString::fromLocal8Bit("文件大小:") <<info.size();
 59         qDebug() << QString::fromLocal8Bit("文件创建时间:") <<
 60                     info.created().toString("yyyy-MM-dd hh:mm:ss");
 61 
 62     }
 63 }
 64 
 65 void MainWindow::on_buttonWrite_clicked()
 66 {
 67     QString path = QFileDialog::getSaveFileName(this,"save","../","TXT(*.txt)");
 68     if(path.isEmpty() == false)//不为空
 69     {
 70         QFile file;//创建文件对象
 71         //关联文件名字
 72         file.setFileName(path);
 73         //打开文件,只写方式
 74         bool isOK = file.open(QIODevice::WriteOnly);
 75         if(isOK == true)
 76         {
 77             //获取编辑区内容
 78             QString str = ui->textEdit->toPlainText();
 79             //写文件
 80             //把QString转换成QByteArray
 81             //file.write(str.toUtf8());
 82 
 83             //QString -> C++ string -> char *
 84             //file.write(str.toStdString().data());
 85 
 86             //把QString转换成本地编码
 87             file.write(str.toLocal8Bit());
 88 
 89 
 90             //字符类型的转换
 91             //把QString转换成QByteArray
 92             QString string = "123";
 93             QByteArray a = string.toUtf8();//主要是针对中文
 94             a = string.toLocal8Bit();//本地编码
 95             //QByteArray -> char *
 96             char *b = a.data();
 97             //char * -> QString
 98             char *p = "abc";
 99             QString c = QString(p);
100 
101         }
102         file.close();
103 
104 
105     }
106 }

三、QDataStream、QTextStream、QBuffer类操作文件

  (1)QDataStream:二进制方式操作数据流
  (2)QTextStream:文本方式操作数据流
  (3)QBuffer:内存文件

代码如下:

mainwindow.h

 1 #ifndef MAINWINDOW_H
 2 #define MAINWINDOW_H
 3 
 4 #include <QMainWindow>
 5 
 6 namespace Ui {
 7 class MainWindow;
 8 }
 9 
10 class MainWindow : public QMainWindow
11 {
12     Q_OBJECT
13 
14 public:
15     explicit MainWindow(QWidget *parent = 0);
16     ~MainWindow();
17 
18     void writeData();
19     void readData();
20 
21     void buffer();
22 
23 private:
24     Ui::MainWindow *ui;
25 };
26 
27 #endif // MAINWINDOW_H

mainwindow.cpp

  1 #include "mainwindow.h"
  2 #include "ui_mainwindow.h"
  3 #include <QDataStream>//二进制方式操作数据流
  4 #include <QTextStream>//文本方式操作数据流
  5 #include <QBuffer>//内存文件
  6 #include <QByteArray>
  7 #include <QFile>
  8 #include <QDebug>
  9 //宏定义,输出 代码所在位置 和 所在行数
 10 #define cout qDebug() << "[" << __FILE__ << ":" << __LINE__ << "]"
 11 
 12 MainWindow::MainWindow(QWidget *parent) :
 13     QMainWindow(parent),
 14     ui(new Ui::MainWindow)
 15 {
 16     ui->setupUi(this);
 17 
 18     writeData();
 19     readData();
 20 
 21     buffer();
 22 
 23 }
 24 
 25 MainWindow::~MainWindow()
 26 {
 27     delete ui;
 28 }
 29 void MainWindow::writeData()
 30 {
 31     //二进制方式操作数据流
 32     /*
 33     //创建文件对象
 34     QFile file("../test.txt");
 35     //打开文件,只写方式
 36     bool isOK = file.open(QIODevice::WriteOnly);
 37     if(isOK == true)
 38     {
 39         //创建数据流,和file文件关联
 40         //往数据流中输数据,相当于往文件里写数据
 41         QDataStream stream(&file);
 42         //二进制编码,所以写的文本文档打开后的内容是乱码
 43         stream << QString("")<<250;//往数据流输入数据,,是以二进制的形式输入
 44         file.close();
 45     }
 46     */
 47 
 48 
 49     //文本方式操作数据流
 50     QFile file;
 51     file.setFileName("../demo.txt");
 52     bool isOK = file.open(QIODevice::WriteOnly);
 53     if(isOK == true)
 54     {
 55         QTextStream stream(&file);
 56         //默认是平台编码,所以文本可以直接看到内容
 57         //可以指定编码
 58         stream.setCodec("UTF-8");
 59         stream << QString("")<<250;
 60         file.close();
 61     }
 62 
 63 }
 64 void MainWindow::readData()
 65 {
 66 
 67     //二进制方式操作数据流
 68     /*
 69     //创建文件对象
 70     QFile file("../test.txt");
 71     //打开文件,只读方式
 72     bool isOK = file.open(QIODevice::ReadOnly);
 73     if(isOK == true)
 74     {
 75         //创建数据流,和file文件关联
 76         //从数据流中读数据,相当于从文件里读数据
 77         QDataStream stream(&file);
 78         //读的时候,按写的顺序取数据
 79         QString str;
 80         int a;
 81         stream >> str >> a;
 82         qDebug() << str.toUtf8().data() << a ;
 83         cout << str.toUtf8().data() << a ;
 84 
 85         file.close();
 86     }
 87     */
 88 
 89 
 90     //文本方式操作数据流
 91     QFile file;
 92     file.setFileName("../demo.txt");
 93     bool isOK = file.open(QIODevice::ReadOnly);
 94     if(isOK == true)
 95     {
 96         QTextStream stream(&file);
 97         //默认是平台编码,所以文本可以直接看到内容
 98         //可以指定编码
 99         stream.setCodec("UTF-8");
100 
101         //此处读文件的时候,不需要象QDataStream一样先按照类型读
102         QString str = stream.readAll();
103         cout << str.toUtf8().data() ;
104         file.close();
105     }
106 
107 
108 }
109 
110 void MainWindow::buffer()
111 {
112     QByteArray array;
113     QBuffer memFile(&array);//将缓冲区的内容存到数组中
114     //QBuffer memFile;//创建内存文件
115     memFile.open(QIODevice::WriteOnly);
116     memFile.write("11111111");//写到缓冲区
117     memFile.write("22222222");
118     memFile.close();
119     qDebug() << memFile.buffer();//得到缓冲区的内容
120     qDebug() << "array" << array;
121 }
原文地址:https://www.cnblogs.com/blog-ccs/p/7453381.html