C++/Qt 读写文件

这篇具有很好参考价值的文章主要介绍了C++/Qt 读写文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

之前写过两篇跟文件操作相关的博客,有兴趣也可以看一下:

C语言读写文件

Qt关于文件路径的处理

先讲一些关于基础文本文件和二进制文件的读写操作,后续将会整理C++/Qt关于ini、xml、json、xlsx相关文件的读写操作。

C++

相比于C语言使用FILE文件指针来实现文件操作,C++ 采用的是标准库中的fstream类来实现文件的打开、关闭、读取和写入。

引入头文件:

#include <fstream>

打开文件:

 explicit ifstream(const char* fileName, ios_base::openmode mode = ios_base::in);
 explicit ifstream(const string& fileName, ios_base::openmode mode = ios_base::in);

第一个参数表示文件名,第二个表示打开方式,关于打开方式有以下几种,以下是官方给出的定义说明:

 // 27.4.2.1.4  Type ios_base::openmode
    /**
     *  @brief This is a bitmask type.
     *
     *  @c @a _Ios_Openmode is implementation-defined, but it is valid to
     *  perform bitwise operations on these values and expect the Right
     *  Thing to happen.  Defined objects of type openmode are:
     *  - app
     *  - ate
     *  - binary
     *  - in
     *  - out
     *  - trunc
    */
    typedef _Ios_Openmode openmode;

    /// Seek to end before each write.
    static const openmode app =		_S_app;

    /// Open and seek to end immediately after opening.
    static const openmode ate =		_S_ate;

    /// Perform input and output in binary mode (as opposed to text mode).
    /// This is probably not what you think it is; see
    /// https://gcc.gnu.org/onlinedocs/libstdc++/manual/fstreams.html#std.io.filestreams.binary
    static const openmode binary =	_S_bin;

    /// Open for input.  Default for @c ifstream and fstream.
    static const openmode in =		_S_in;

    /// Open for output.  Default for @c ofstream and fstream.
    static const openmode out =		_S_out;

    /// Open for input.  Default for @c ofstream.
    static const openmode trunc =	_S_trunc;
ios::in 以读取的方式打开文件
ios::out 以写入的方式打开文件,如果文件不存在则会创建文件
ios::ate 打开文件时定位到文件尾部
ios::app 以追加的形式打开文件,写入的内容将会添加到文件末尾
ios::trunc 打开文件时将清空文件原有的内容
ios::binary 以二进制的方式打开文件

这些方式可以采用“|”组合使用,例如:

	fstream file;
	file.open("1.txt", ios::out | ios::app);

以写入的方式打开文件1.txt,写入的内容将会追加到文件末尾。 

关闭文件:

close()

读取文件示例:

fstream file;
	file.open("1.txt", ios::in);
	if (file.is_open()) {
		string line;
		while (getline(file, line)) {
			cout << line << endl;
		}
		file.close();
	}

只读方式打开文件1.txt,如果该文件存在则会逐行打印文件内容

 1.txt文件内容:

C++/Qt 读写文件,QT,C/C++,c++,开发语言

运行结果:

C++/Qt 读写文件,QT,C/C++,c++,开发语言

写文件示例:

	fstream file;
	file.open("1.dat", ios::out | ios::trunc);
	if (file.is_open()) {
		file << "123";
		file << endl;
		file << "456";
		file << endl;
		file.close();
	}

以写文件的方式打开文件1.dat并且会先清空文件原有内容,执行后文件内容为:

C++/Qt 读写文件,QT,C/C++,c++,开发语言

Qt

Qt关于文件的打开、关闭、读取、写入操作将会用QFile、QTextStream、QDataStream,其中QFile负责文件的打开与关闭操作,QTextStream和QDataStream将以文本数据流和二进制数据流的方式读写文件。

打开文件:

    bool open(OpenMode flags) override;
    bool open(FILE *f, OpenMode ioFlags, FileHandleFlags handleFlags=DontCloseHandle);
    bool open(int fd, OpenMode ioFlags, FileHandleFlags handleFlags=DontCloseHandle);

​

也是需要指定文件的打开OpenMode,OpenMode有以下定义:

QIODevice::NotOpen

设备未打开

QIODevice::ReadOnly

只读形式打开

QIODevice::WriteOnly

写文件形式打开,文件不存在则会创建文件

QIODevice::ReadWrite

读写形式打开

QIODevice::Append

追加形式打开,写入内容将添加到文件尾

QIODevice::Truncate

截断形式打开,会清除文件原版内容

QIODevice::Text

文本形式打开,读取时,行结束符被翻译为'\n'。在写入时,行结束符被转换为本地编码,例如Win32中的'\r\n'

QIODevice::Unbuffered

无缓冲形式打开,设备中的任何缓冲区都被绕过

QIODevice::NewOnly

如果要打开的文件已经存在,则失败。仅在文件不存在时创建并打开该文件。操作系统保证您是唯一创建和打开文件的人。注意,此模式意味着WriteOnly,并且允许将其与ReadWrite结合使用。这个标志目前只影响QFile。其他类将来可能会使用此标志,但在此之前,对QFile以外的任何类使用此标志可能会导致未定义的行为(自Qt 5.11起)

QIODevice::ExistingOnly

如果要打开的文件不存在,则失败。此标志必须与ReadOnly, WriteOnly或ReadWrite一起指定。注意,单独对ReadOnly使用此标志是多余的,因为当文件不存在时,ReadOnly已经失败了。这个标志目前只影响QFile。其他类将来可能会使用此标志,但在此之前,对QFile以外的任何类使用此标志可能会导致未定义的行为(自Qt 5.11起)

这些也是可以使用“|”一起使用的。
关闭文件:

close()

QTextStream:

QTextStream以文本数据流的形式读写文件。

头文件:

#include <QTextStream>

读文件示例:

    QFile file("1.txt");
    if (file.open(QIODevice::ReadOnly)) {
        QTextStream in(&file);
        while (!in.atEnd())
        {
            qDebug()<<in.readLine();
        }
        file.close();
    }

以只读的形式打开1.txt文件,然后逐行打印文件内容。

写文件示例:

   QFile file("1.txt");    
   if (file.open(QIODevice::WriteOnly|QIODevice::Append)) {
        QTextStream out(&file);
        out<<"123aa";
        out<<endl;
        out<<"456aa";
        out<<endl;
        file.close();
    }

以写文件的形式打开,并且写入的内容会在文件末尾追加内容。
QDataStream:

QDataStream是以二进制数据流的形式进行文件的读写操作,用于将二进制数据到 QIODevice 的序列化。

头文件:

#include <QDataStream>

示例:

    QFile file("1.dat");
    if (file.open(QIODevice::WriteOnly|QIODevice::Truncate)) {
        QDataStream out(&file);
        out << QString("abc");
        out << (int)123;
        file.close();
    }

以写文件以及截断方式打开文件1.dat,依次写入字符串“abc”和int整形123,程序执行后用notepad++打开对应文件预览:

C++/Qt 读写文件,QT,C/C++,c++,开发语言

可以看到因为是二进制形式写入文件中所以是不支持预览的,但是用对应的QDataStream可以直接读取:

QFile file("1.dat");    
if (file.open(QIODevice::ReadOnly)) {
        QDataStream in(&file);
        int i;
        QString s;
        in>>s;
        in>>i;
        qDebug()<<i<<s;
        file.close();
}

运行结果:

C++/Qt 读写文件,QT,C/C++,c++,开发语言

将图片数据写入文件:

    QFile file("1.dat");
    QFile pic("1.png");
    if (file.open(QIODevice::WriteOnly|QIODevice::Truncate) && pic.open(QIODevice::ReadOnly)) {
        QDataStream out(&file);
        out << pic.fileName();
        out << pic.readAll();
        file.close();
    }

将图片文件1.png的文件名和文件数据写入到文件1.dat中 ,反正也可以读取对应图片数据生成对应图片文件:

    QFile file("1.dat");
    if (file.open(QIODevice::ReadOnly)) {
        QDataStream in(&file);
        QByteArray data;
        QString name;
        in>>name;
        in>>data;
        QPixmap pix;
        pix.loadFromData(data);
        pix.save(name);
        file.close();
    }

QDataStream读写自定义数据:

比如用DataStream实现自定义结构体数据的读写。

    struct MyStruct {
        int i;
        QString s;
        double d;
        friend QDataStream& operator <<(QDataStream &stream, const MyStruct &ms)
        {
            stream<<ms.i<<ms.s<<ms.d;
            return stream;
        }

        friend QDataStream& operator >>(QDataStream &stream, MyStruct &ms)
        {
            stream>>ms.i>>ms.s>>ms.d;
            return stream;
        }
    };

需要重载对应<<和>>操作符

    QFile file("1.dat");
    if (file.open(QIODevice::WriteOnly|QIODevice::Truncate)) {
        QDataStream out(&file);
        MyStruct my;
        my.i = 1;
        my.s = "a";
        my.d = 1.1;
        out<<my;
        file.close();
    }

读取:
 

    if (file.open(QIODevice::ReadOnly)) {
        QDataStream in(&file);
        MyStruct ms;
        in>>ms;
        qDebug()<<ms.i<<ms.s<<ms.d;
        file.close();
    }

运行效果:

C++/Qt 读写文件,QT,C/C++,c++,开发语言

 成功读取对应文件中的结构体数据。文章来源地址https://www.toymoban.com/news/detail-629113.html

到了这里,关于C++/Qt 读写文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++/Qt 读写文件

    之前写过两篇跟文件操作相关的博客,有兴趣也可以看一下: C语言读写文件 Qt关于文件路径的处理 先讲一些关于基础文本文件和二进制文件的读写操作,后续将会整理C++/Qt关于ini、xml、json、xlsx相关文件的读写操作。 相比于C语言使用FILE文件指针来实现文件操作,C++ 采用的

    2024年02月14日
    浏览(44)
  • qt读写xml文件

    Qt使用XML模块,在.pro文件中添加 QT += xml Qt 提供了三种读 写  XML 文档的方法: QXmlStreamReader / QXmlStreamWriter: 一种快速的基于流的方式访问良格式 XML 文档 , 特别适合于实现一次解析器(所谓“一次解析器”,可以理解成我们只需读取文档一次,然后像一个遍历器从头到尾一

    2024年02月11日
    浏览(38)
  • Qt——文件的读写操作

    文件的读写是很多应用程序具有的功能,甚至某些应用程序就是围绕着某一种格式文件的处理而开发的,所以文件读写是应用程序开发的一个基本功能。 Qt 提供了两种读写纯文本文件的基本方法: 用 QFile 类 的 IODevice 读写功能直接进行读写 利用 QFile 和 QTextStream 结合起来,

    2024年02月13日
    浏览(44)
  • Qt读写文件

    项目文件结构 样例文件 再次读取 获取文件信息  

    2024年02月11日
    浏览(47)
  • 「Qt」文件读写操作

            我们知道 C 和 C++ 都提供了文件读写的类库,不过 Qt 也有一套自己的文件读写操作;本文主要介绍 Qt 中进行文件读写操作的类 —— QFile 。         一般的桌面应用程序,当我们想要打开一个文件时,通常会弹出一个文件对话框。在 Qt 中,文件对话框使用 QFileDial

    2024年02月12日
    浏览(40)
  • Qt文件系统操作和文件的读写

    QIODevice:所有输入输出设备的基础类 QFile :用于文件操作和文件数据读写的类 QSaveFile :用于安全保存文件的类 QTemporaryFile :用于创建临时文件的类 QTcpSocket 和 QUdpSocket :分别实现了TCP和UDP的类 QSerialPort :实现串口通信的类 QBluetoothSocket :用于蓝牙通信的类 QProcess :用于启

    2024年02月12日
    浏览(48)
  • 【Qt学习】08:文件读写操作

    文件操作是应用程序必不可少的部分,Qt 作为一个通用开发库提供了跨平台的文件操作能力。Qt 通过QIODevice提供了对 I/O 设备的抽象,这些设备具有 读写字节块 的能力,以下是 I/O 设备的类图: QIODevice:所有 I/O 设备类的父类,提供了字节块读写的通用操作以及基本接口;

    2024年02月11日
    浏览(38)
  • Qt多线程读写大型文本文件项目

    目录 一 功能列表 二 架构设计 三 代码实现 四 软件原型效果 五 测试验证 六 项目工程打包发布 七 项目完整源码获取 显示文件路径选择框,仅展示 .txt类型文件可选; 读取文本文件,显示到桌面控件中; 读取的文件使用多线程处理,不影响显示界面正常操作; 读取过来

    2024年02月01日
    浏览(43)
  • Qt中的文件读写几种方式

    思路 做文件读写的软件时,首先应该有文件对话框供我们打开可选的特定文件,然后才是去读取数据,对应的参数分别是(父指针,标题,路径,文件类型筛选字符串) 直接使用QFile类读文件 使用QTextstream的 readLine()或者readAll()读文件,readAll()不适合大文件 使用QTextStream的oper

    2024年02月12日
    浏览(36)
  • Qt 读写文件(QFile&QTextStream&QDataStream) 详解

    一、读写文本文件 (QFile 类) Qt QFile类是一个用于读取和写入文件的类,它提供了对文件的访问、读取和写入等操作。它既可以操作文本文件,也可以操作二进制文件。 QFile类的功能包括: 打开、关闭文件 读取文件内容 写入文件内容 支持文本模式和二进制模式的文件读写 支

    2024年02月04日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包