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 }