Qt Creator模块学习——文件,目录和输入/输出(一)

Qt Creator模块学习——文件,目录和输入/输出(一)

一. 文件和目录

1. 输入/输出设备

QIODevice类是Qt中所有I/0设备的基础接口类,例如QFile,QBuffer和QTcpSocket等支持读/写数据块的设备提供了一个抽象接口。
在整个流程当中,我们往往通过open()函数打开该设备,而且必须指定正确的打开模式。QIODevice中所有的打开模式都是由QIODevice::OpenMode枚举类型定义,其取值大家可以自行查找,太多了…
咱们只拿几个举例

常量描述
QIODevice::NotOpen设备没有打开
QIODevice::ReadOnly设备以只读方式打开,不可写
QIODevice::WriteOnly设备以只写方式打开,不可读
QIODevice::ReadWrite以读写方式打开
QIODevice::Append以附加模式打开(在文件末尾)
QIODevice::Truncate如果可以的话,设备在打开前会被截断,设备先前的内容也都会丢失
QIODevice::Text读取时,行结尾终止符被转化为"/n",当写入时行结尾终止符会被转为本地编码
QIODevice::Unbuffered绕过设备所有的缓冲区

在进行写入读取后,通过close()关闭设备。
QIODevice可以对设备进行区别,区别成顺序存储设备和随机存储设备。
随机存储设备可以通过seek()函数定义任意位置,当前位置也可以用pos()函数获取。用于QFile,QBuffer。
顺序存储设备不能定位任意区域,数据必须一次读取用于QTcpStock,QProcess。

在程序中isSequential()函数判断设备类型。

QTcpStock,QProcess是两个大模块,我们现在要说的是QFile。

2.文件操作

QFile类提供了读/写设备的接口,它可以读/写文本文件,二进制文件和Qt资源的I/O设备。QFile可以单独使用,但是为了方便我们往往和QTextStream/QDataStream结合使用。

QFileInfo类是提供与系统无关的文件信息,如大小名字位置等。

#include "mainwindow.h"
#include <QApplication>
#include <QFile>
#include <QStringList>
#include <QCoreApplication>
#include <QFileInfo>
#include <QDebug>
#include <QDateTime>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //以只写方式打开,若文件不存在则创建
    QFile file("file.txt");
    if(!file.open(QIODevice::WriteOnly|QIODevice::Text))
        qDebug()<<file.errorString();
    file.write("hello,Qt \angxn!!");
    file.close();
    QFileInfo info(file);
    qDebug()<<QObject::tr("绝对路径:")<<info.absoluteFilePath()<<endl
            <<QObject::tr("文件名:")<<info.fileName()<<endl
            <<QObject::tr("基本名称:")<<info.baseName()<<endl
            <<QObject::tr("后缀:")<<info.suffix()<<endl
            <<QObject::tr("创建时间:")<<info.created()<<endl
            <<QObject::tr("大小:")<<info.size();
    //以只读方式打开
    if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
        qDebug()<<file.errorString();
    qDebug()<<QObject::tr("文件内容:")<<endl<<file.readAll();
    qDebug()<<QObject::tr("当前位置:")<<file.pos();
    file.seek(0);
    QByteArray array;
    array = file.read(5);
    qDebug()<<QObject::tr("前五个字符:")<<array
           <<QObject::tr("当前位置:")<<file.pos();
    file.seek(15);
    array = file.read(5);
    qDebug()<<QObject::tr("第16-20个字符")<<array;
    file.close();
    return a.exec();
}

运行结果如下:
在这里插入图片描述

3.目录操作

QDir类用来访问目录结构及其内容,还可以访问操作路径名,访问路径和文件的相关信息等。
下面我们举个例子:
在mainwindow.ui里拖入一个List Widget部件
随后在.h文件中加入私有对象:

#include <QFileSystemWatcher>

private:
    QFileSystemWatcher myWatcher;
private slots:
    void showMessage(const QString &path);

main.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDir>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(&myWatcher,&QFileSystemWatcher::directoryChanged,
            this,&MainWindow::showMessage);
    connect(&myWatcher,&QFileSystemWatcher::fileChanged,
            this,&MainWindow::showMessage);
    //显示当前目录下所有文件
    QDir mydir(QDir::currentPath());
    mydir.setNameFilters(QStringList("*h"));
    ui->listWidget->addItem(mydir.absolutePath()+ tr("目录下的.h文件"));
    ui->listWidget->addItems(mydir.entryList());
    //创建目录加入显示器
    mydir.mkdir("mydir");
    mydir.cd("mydir");
    ui->listWidget->addItem(tr("监视目录:")+mydir.absolutePath());
    myWatcher.addPath(mydir.absolutePath());
    //创建文件加入监视器
    QFile file(mydir.absolutePath()+"/myfile.txt");
    if(file.open(QIODevice::WriteOnly)){
        QFileInfo info(file);
        ui->listWidget->addItem(tr("监视的文件:")+ info.absolutePath());
        myWatcher.addPath(info.absoluteFilePath());
        file.close();
    }
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::showMessage(const QString &path){
    QDir dir(QDir::currentPath()+"/mydir");
    //如果目录发生改变
    if(path==dir.absolutePath()){
        ui->listWidget->addItem(dir.dirName()+tr("目录发生改变:"));
        ui->listWidget->addItems(dir.entryList());
    }
    else{
        ui->listWidget->addItem(path+tr("文件发生改变"));
    }
}

大家可以自行感受。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QT Creator中,可以使用QFileDialog类和QFile类来保存文件到指定的文件夹。 首先,需要创建一个QFileDialog对象,以便用户选择要保存的文件名和文件夹。可以使用getSaveFileName()方法来弹出一个文件对话框,让用户选择要保存的文件名和文件夹。例如: ``` QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), QDir::currentPath(), tr("Text Files (*.txt)")); ``` 上述代码会弹出一个文件对话框,让用户选择要保存的文件名和文件夹,并返回用户选择的文件名。其中,第一个参数为父窗口,第二个参数为对话框标题,第三个参数为默认打开的文件夹路径,第四个参数为文件类型过滤器。 接下来,可以使用QFile类来保存文件。例如: ``` QFile file(fileName); if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream out(&file); out << "Hello, world!"; file.close(); } ``` 上述代码会创建一个QFile对象,打开文件并写入文本内容。其中,第一个参数为文件名,第二个参数为打开文件的方式(这里是只写和文本模式)。然后,可以使用QTextStream类来写入文本内容。 最后,记得关闭文件。 完整代码示例: ``` #include <QFileDialog> #include <QFile> #include <QTextStream> void saveFile() { // 弹出文件对话框,让用户选择要保存的文件名和文件夹 QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), QDir::currentPath(), tr("Text Files (*.txt)")); // 创建文件并写入内容 QFile file(fileName); if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream out(&file); out << "Hello, world!"; file.close(); } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值