C/C++ Qt 基本文件读写方法

本文介绍了使用Qt进行文件操作的两种方式,包括QFile的IODevice读写功能和QTextStream配合的流式处理,详细展示了文本读写、行数计算及追加写入等操作实例。

Qt文件操作有两种方式,第一种使用QFile类的IODevice读写功能直接读写,第二种是利用 QFile和QTextStream结合起来,用流的方式进行文件读写。

使用 QFile 类的 IODevice 读写功能是Qt中一种直接的文件操作方式。通过 QFile 提供的函数,可以打开、读取和写入文件内容。QFile 本身是 IODevice 类的派生类,它封装了文件的基本操作,并通过调用 IODevice 的函数来实现底层的文件读写。这种方式适用于对文件内容进行基本读取和写入的场景,是一种直接而简单的文件操作方式。

QFile类读写文件

#include <QCoreApplication>
#include <iostream>
#include <QFile>
#include <QString>
#include <QTextStream>

// 一次读入所有文本
bool ReadFileOnly(const QString &file_path)
{
    QFile ptr(file_path);

    // 文件是否存在
    if(!ptr.exists())
    {
        return false;
    }

    // 文件是否打开
    /*
    ReadOnly   以只读方式打开
    WriteOnly  以只写方式打开
    ReadWrite  读写方式打开
    Append     以追加方式打开
    Truncate   以截取方式打开(原有内容被清空)
    Text       以文件方式打开
    */

    if(!ptr.open(QIODevice::ReadWrite | QIODevice::Text))
    {
        return false;
    }

    QString text = ptr.readAll();
    std::cout << text.toStdString() << std::endl;
    ptr.close();
}

// 追加写入文本
bool WriteFileOnly(const QString &file_path, QString save)
{
    // 如果参数为空则返回假
    if(file_path.isEmpty() && save.isEmpty())
    {
        return false;
    }

    QFile ptr(file_path);
    if(!ptr.open(QIODevice::Append | QIODevice::Text))
    {
        return false;
    }

    QByteArray str_bytes = save.toUtf8();

    ptr.write(str_bytes,str_bytes.length());
    ptr.close();
    return true;
}

QTextStream读写文件

#include <QCoreApplication>
#include <iostream>
#include <QFile>
#include <QString>
#include <QTextStream>
#include <QTextCodec>

// 计算文件行数
qint32 get_file_count(const QString &file_path)
{
    QFile ptr(file_path);
    qint32 count = 0;

    if(ptr.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        QTextStream in(&ptr);

        // 自动检测unicode编码,显示中文
        in.setAutoDetectUnicode(true);

        while(!in.atEnd())
        {
            QString line = in.readLine();
            std::cout << line.toStdString() << std::endl;
            count = count +1;
        }

        return count;
    }
    return 0;
}

// 追加写入数据
bool write_file_stream(const QString &file_path, QString save)
{
    QFile ptr(file_path);

    if(ptr.open(QIODevice::Append | QIODevice::Text))
    {
        QTextStream in(&ptr);
        in << save;
    }
    ptr.close();
    return true;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 设置编码
    QTextCodec *codec = QTextCodec::codecForName("utf-8");
    QTextCodec::setCodecForLocale(codec);

    // 流写入
    write_file_stream("d://test.txt","hello lyshark");
    write_file_stream("d://test.txt","你好,世界");

    // 取文本长度
    qint32 count = get_file_count("d://test.txt");
    std::cout << "line = > " << count << std::endl;
    return a.exec();
}

Qt文件操作有两种方式,第一种使用QFile类的IODevice读写功能直接读写,第二种是利用 QFile和QTextStream结合起来,用流的方式进行文件读写。

第一种,利用QFile中的相关函数,实现对文件的读写操作,QFile会调用IODevice设备,从而实现文件读写。

QT基本文件读写

通过QFile实现文本文件读写操作.

#include <QCoreApplication>
#include <iostream>
#include <QFile>
#include <QString>
#include <QTextStream>

// 一次读入所有文本
bool ReadFileOnly(const QString &file_path)
{
    QFile ptr(file_path);

    // 文件是否存在
    if(!ptr.exists())
    {
        return false;
    }

    // 文件是否打开
    /*
    ReadOnly   以只读方式打开
    WriteOnly  以只写方式打开
    ReadWrite  读写方式打开
    Append     以追加方式打开
    Truncate   以截取方式打开(原有内容被清空)
    Text       以文件方式打开
    */

    if(!ptr.open(QIODevice::ReadWrite | QIODevice::Text))
    {
        return false;
    }

    QString text = ptr.readAll();
    std::cout << text.toStdString() << std::endl;
    ptr.close();
}

// 追加写入文本
bool WriteFileOnly(const QString &file_path, QString save)
{
    // 如果参数为空则返回假
    if(file_path.isEmpty() && save.isEmpty())
    {
        return false;
    }

    QFile ptr(file_path);
    if(!ptr.open(QIODevice::Append | QIODevice::Text))
    {
        return false;
    }

    QByteArray str_bytes = save.toUtf8();

    ptr.write(str_bytes,str_bytes.length());
    ptr.close();
    return true;
}

QTextStream 实现流读写

直接使用流写入,可以使用<< 运算符,方便的写入文本。

#include <QCoreApplication>
#include <iostream>
#include <QFile>
#include <QString>
#include <QTextStream>
#include <QTextCodec>

// 计算文件行数
qint32 get_file_count(const QString &file_path)
{
    QFile ptr(file_path);
    qint32 count = 0;

    if(ptr.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        QTextStream in(&ptr);

        // 自动检测unicode编码,显示中文
        in.setAutoDetectUnicode(true);

        while(!in.atEnd())
        {
            QString line = in.readLine();
            std::cout << line.toStdString() << std::endl;
            count = count +1;
        }

        return count;
    }
    return 0;
}

// 追加写入数据
bool write_file_stream(const QString &file_path, QString save)
{
    QFile ptr(file_path);

    if(ptr.open(QIODevice::Append | QIODevice::Text))
    {
        QTextStream in(&ptr);
        in << save;
    }
    ptr.close();
    return true;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 设置编码
    QTextCodec *codec = QTextCodec::codecForName("utf-8");
    QTextCodec::setCodecForLocale(codec);

    // 流写入
    write_file_stream("d://test.txt","hello lyshark");
    write_file_stream("d://test.txt","你好,世界");

    // 取文本长度
    qint32 count = get_file_count("d://test.txt");
    std::cout << "line = > " << count << std::endl;
    return a.exec();
}
### 推荐的Linux C/C++配置文件读写库 在Linux平台上进行C/C++开发时,读写配置文件是一个常见的需求。以下是一些推荐的库和方法,可以帮助开发者高效地实现这一功能。 #### 1. **自定义实现** 如果项目规模较小或对性能要求较高,可以选择自己实现配置文件读写功能。例如,引用中的`CReadConfig`类[^2]提供了一个简单的接口来读取和写入配置文件。该类通过`ReadConf`和`WriteConf`函数分别实现配置项的读取和写入,并支持基于键值对的配置格式。这种方式的优点是灵活性高,但需要开发者自行处理复杂的配置逻辑。 ```cpp #include "ReadConfig.h" int main() { CReadConfig config; char value[256]; config.ReadConf("config.ini", "App", "Key", value); printf("Value: %s\n", value); return 0; } ``` #### 2. **Boost.PropertyTree** `Boost.PropertyTree`是一个强大的库,能够解析多种格式的配置文件(如INI、XML、JSON等)。它提供了统一的接口来读取和写入配置数据,非常适合需要支持多种配置格式的项目。 - **优点**:支持多种格式,易于使用。 - **缺点**:依赖于Boost库,可能增加项目的复杂性。 ```cpp #include <boost/property_tree/ptree.hpp> #include <boost/property_tree/ini_parser.hpp> using namespace boost::property_tree; int main() { ptree pt; read_ini("config.ini", pt); std::string value = pt.get<std::string>("App.Key"); std::cout << "Value: " << value << std::endl; pt.put("App.Key", "NewValue"); write_ini("config.ini", pt); return 0; } ``` #### 3. **Glib-GSettings** 对于使用GTK+或其他GNOME技术栈的项目,`Glib-GSettings`是一个不错的选择。它提供了一种现代化的方式来管理应用程序的配置,支持Schema机制,并且与D-Bus集成良好。 - **优点**:现代、高效,适合GNOME环境。 - **缺点**:学习曲线较陡,适合特定场景。 ```c #include <gio/gio.h> int main() { GSettings *settings = g_settings_new("org.example.app"); const gchar *value = g_settings_get_string(settings, "key"); g_print("Value: %s\n", value); g_settings_set_string(settings, "key", "NewValue"); g_object_unref(settings); return 0; } ``` #### 4. **Libconfig** `Libconfig`是一个轻量级的库,专门用于处理配置文件。它支持结构化的配置文件格式,并提供了C和C++的API。 - **优点**:简单易用,支持复杂的数据结构。 - **缺点**:不支持INI格式,需要适应其专有格式。 ```cpp #include <libconfig.h++> using namespace libconfig; int main() { Config cfg; cfg.readFile("config.cfg"); const Setting& root = cfg.getRoot(); const Setting& app = root["App"]; std::string value = app["Key"]; std::cout << "Value: " << value << std::endl; app["Key"] = "NewValue"; cfg.writeFile("config.cfg"); return 0; } ``` #### 5. **QSettings(Qt框架)** 如果项目使用了Qt框架,`QSettings`是一个非常方便的工具。它可以处理INI、INI-like和注册表格式的配置文件,并且具有跨平台特性。 - **优点**:简单、强大,适合Qt项目。 - **缺点**:仅适用于Qt项目。 ```cpp #include <QCoreApplication> #include <QSettings> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QSettings settings("config.ini", QSettings::IniFormat); QString value = settings.value("App/Key").toString(); qDebug() << "Value:" << value; settings.setValue("App/Key", "NewValue"); return 0; } ``` ### 总结 根据项目需求选择合适的库非常重要。如果需要轻量级解决方案,可以考虑自定义实现或使用`Libconfig`;如果需要支持多种格式并追求灵活性,`Boost.PropertyTree`是一个不错的选择;对于GNOME环境下的项目,`Glib-GSettings`更为合适;而对于Qt项目,`QSettings`无疑是最佳选择。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微软技术分享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值