QFile类读写文件编程

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/S3090748221/article/details/60328682

          QFile提供了从文件中读取和写入数据的能力。

我们通常会将文件路径作为参数传给QFile的构造函数。不过也可以在创建好对象最后,使用setFileName()来修改。QFile需要使用 / 作为文件分隔符,不过,它会自动将其转换成操作系统所需要的形式。例如C:/windows 这样的路径在 Windows 平台下同样是可以的。

          QFile主要提供了有关文件的各种操作,比如打开文件、关闭文件、刷新文件等。我们可以使用QDataStream或QTextStream类来读写文件,也可以使用QIODevice类提供的read()、readLine()、readAll()以及write()这样的函数。值得注意的是,有关文件本身的信息,比如文件名、文件所在目录的名字等,则是通过QFileInfo获取,而不是自己分析文件路径字符串。


下面我们使用一段代码来看看QFile的有关操作:
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
 
    QFile file("in.txt");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "Open file failed.";
        return -1;
    } else {
        while (!file.atEnd()) {
            qDebug() << file.readLine();
        }
    }
 
    QFileInfo info(file);
    qDebug() << info.isDir();
    qDebug() << info.isExecutable();
    qDebug() << info.baseName();
    qDebug() << info.completeBaseName();
    qDebug() << info.suffix();
    qDebug() << info.completeSuffix();
 
    return app.exec();
}
我们首先使用QFile创建了一个文件对象。
这个文件名字是 in.txt。如果你不知道应该把它放在哪里,可以使用QDir::currentPath()来获得应用程序执行时的当前路径。只要将这个文件放在与当前路径一致的目录下即可。
使用open()函数打开这个文件,打开形式是只读方式,文本格式。
这个类似于fopen()的 r 这样的参数。open()函数返回一个 bool 类型,如果打开失败,我们在控制台输出一段提示然后程序退出。否则,我们利用 while 循环,将每一行读到的内容输出。
可以使用QFileInfo获取有关该文件的信息。
QFileInfo有很多类型的函数,我们只举出一些例子。比如:
isDir()检查该文件是否是目录;
isExecutable() 检查该文件是否是可执行文件等。
baseName() 可以直接获得文件名;
completeBaseName() 获取完整的文件名
suffix() 则直接获取文件后缀名。
completeSuffix() 获取完整的文件后缀
我们可以由下面的示例看到,baseName()和completeBaseName(),以及suffix()和completeSuffix()的区别:
QFileInfo fi("/tmp/archive.tar.gz");
QString base  = fi.baseName();  // base = "archive"
QString base  = fi.completeBaseName();  // base = "archive.tar"
QString ext   = fi.suffix();  // ext = "gz"
QString ext   = fi.completeSuffix();  // ext = "tar.gz"


下面通过写一个小案例给大家演示:

void Widget::on_ButtonRead_clicked()
{
    QString path = QFileDialog::getOpenFileName(this,"open","../","TXT(*.txt)");
    if(path.isEmpty() == false)
    {
        //文件对象
        QFile file(path);
        //打开文件,只读方式打开
        bool isok = file.open(QIODevice::ReadOnly);
        if(isok = true)
        {

//          //读文件
//            QByteArray array = file.readAll();
//            ui->textEdit->setText(array);

            QByteArray array;
            while(file.atEnd() == false)
            {
                array += file.readLine();

            }
            ui->textEdit->setText(array);


        }
        //文件关闭
        file.close();
    }
}

void Widget::on_ButtonWrite_clicked()
{
    QString path = QFileDialog::getSaveFileName(this, "save", "../", "TXT(*.txt");
    if(path.isEmpty() == false)
    {
        QFile file;//创建文件对象
        //关联文件名
        file.setFileName(path);
        //打开文件
        bool isok = file.open(QIODevice::WriteOnly);
        if(isok == true)
        {
            //获取编辑区的内容
           QString str = ui->textEdit->toPlainText();
            //写文件
            //QString->QByteArray
//            file.write(str.toUtf8());
           //QString->c++string->char*
//           file.write(str.toStdString().data());

           //转化本地编码
           file.write(str.toLocal8Bit());

           //QString->QByteArray

//           QString buf = "123";
//           QByteArray a = buf.toUtf8();
//           a = buf.toLocal8Bit();

        }
        file.close();

    }


}


展开阅读全文

没有更多推荐了,返回首页