in

理解C++中的文件处理,带有示例

电脑为我们提供了很多处理文件和操作数据的方式。但当你在编程时,你通常希望对文件有更精细的控制和定制能力。而当你处理大量数据时,一些程序可能会引入不必要的开销并影响性能。这些都是你可能需要更强大的技术的情况,尤其是在开发程序时。在本文中,我们将探讨c++文件处理涉及的元素,包括使用的操作和最佳实践。

什么是c++文件处理?

你可能会猜到文件处理是指管理、创建、读取和写入文件的过程,你完全正确。因此,c++文件处理是指我们使用编程语言来操作我们的数据文件。当我们开发c++项目和大量数据时,这通常是首选,因为我们可以在同一语言中快速工作。c++为我们提供了很多可用于处理文件的类。接下来,我们将介绍这些类的基本知识。

文件处理的类

c++中用于处理文件的主要类是ifstream、ofstream和fstream。通常,当我们在使用c++时,我们导入iostream头文件,因为这对所有标准输入/输出操作都是必需的。然而,当我们想要管理文件时,我们要进一步导入fstream类。这为我们提供了有效地操作文件的特定类。我们在下表中总结了类层次结构和类函数:

功能 派生自 继承到 操作
iostream 头文件,提供基本的输入/输出操作 none none <> operators, tie(), flush()
ios 基类,为istream和ostream提供功能 none istream, ostream good(), bad(), fail(), clear(), setstate(), precision(), width()
istream 输入流的基类,用于读取文件 iostream none getline(), ignore(), peek(), get(), open(), close()
ostream 输出流的基类,用于写入文件 iostream none put(), write(), open(), close()
fstreambase 基类,特定于文件流的功能,即打开、关闭和错误处理 iostream ifstream, ofstream, fstream none
ifstream 用于从文件中读取数据。通常继承istream并添加特定功能 fstreambase none 与istream相同,但也具有打开功能
ofstream 用于向文件中写入数据。继承自ostream并添加特定功能 fstreambase none 与ostream相同,但也具有打开功能
fstream 用于读写文件中的数据。继承自istream和ostream,并添加特定功能 fstreambase none 与istream和ostream相同,但也具有打开功能
streambuf 处理流缓冲区的接口,即管理数据存储和传输。 ios none sputc(), sgetc(), sputn(), sgetn()
filebuf 文件和流缓冲区之间的接口。 ios none 与streambuf相同,但也具有打开和关闭功能

在c++中,我们使用特定的类进行文件操作。

©monstar studio/shutterstock.com

文件处理操作

上表中提供了操作的简要概述,但以下内容提供了更多关于这些操作如何工作的详细信息。

操作 用途
<< 重载运算符,将格式化的数据写入输出流。
>> 重载运算符,从输入流中读取格式化的数据。
tie() 获取或设置与另一个流同步的绑定流对象,即输入流或输出流。
flush() 刷新输出序列,即将数据立即写入输出目标。
good() 检查流状态是否良好,如果是则返回true。
bad() 检查流状态是否糟糕,如果是则返回true。
fail() 检查是否发生故障,如果是则返回true。
clear() 清除错误标志并重置流状态。
setstate() 手动设置错误标志。
precision() 设置输出中要显示的小数位数。
width() 设置输出的字段宽度,即要写入的最少字符数。
getline() 从输入流中读取一行文本,直到遇到换行符为止。
ignore() 忽略输入流中的特定数量字符。
peek() 返回输入流的下一个字符而不将其删除。
get() 从输入流中提取单个字符并增加流位置。
open() 打开一个文件进行读取或写入。
close() 关闭一个文件。
put() 将一个字符写入输出流。
write() 将一块数据写入输出流,通常是指定数量的字符。
sputc() 将一个字符写入输出缓冲区。
sgetc() 从输入缓冲区读取一个字符。
sputn() 使用指向缓冲区和指定数量的字符的指针,将一块字符写入输出缓冲区。
sgetn() 使用指向缓冲区和指定数量的字符的指针,从输入缓冲区读取一块字符。

操作示例

现在我们已经了解了文件处理中涉及的基本操作和类,让我们用一个示例来说明其中的一些操作。考虑下面的代码块:

#include 
#include 
#include 

int main() {
    std::ofstream file("data.txt");

    if (file.is_open()) {
        std::string message = "hello, world!";
        int number = 42;

        file.precision(2);
        file.width(10);

        file.tie(&std::cout);

        file << "message: " << message << std::endl;
        file << "number: " << number << std::endl;

        file.flush();

        if (file.good()) {
            std::cout << "file write operation was successful." << std::endl;
        } else {
            std::cout << "file write operation failed." << std::endl;
        }

        file.close();
    } else {
        std::cout << "failed to open the file." << std::endl;
        return 1;
    }

    std::ifstream inputfile("data.txt");

    if (inputfile.is_open()) {
        char character;
        std::string line;

        character = inputfile.get();
        std::cout << "character: " << character << std::endl;

        inputfile.clear();

        inputfile.ignore(4);
        character = inputfile.get();
        std::cout << "next character: " << character << std::endl;

        inputfile.seekg(0);
        character = inputfile.peek();
        std::cout << "peeked character: " << character << std::endl;

        inputfile.ignore(std::numeric_limits::max(), 'n');
        std::getline(inputfile, line);
        std::cout << "line: " << line << std::endl;

        inputfile.close();
    } else {
        std::cout << "failed to open the file for reading." << std::endl;
        return 1;
    }

    return 0;
}

<img_1>

<em>您可以使用c++直接从您的ide管理文件。</em>

©dc studio/shutterstock.com

代码解释

首先,我们导入必要的模块 – “iostream”用于输入/输出操作,“fstream”用于文件操作,“string”用于操作字符串。

打开文件,并声明变量

接下来,我们声明“main()”方法,声明一个名为“file”的对象,并以写模式打开了一个名为“data.txt”的截断文件。然后我们使用“is_open()”检查文件是否成功打开。

在此之后,我们声明了“message”字符串变量,将其赋值为“hello, world!”,并声明“number”整数变量,将其赋值为42。我们还使用“precision()”设置小数位数为2,使用“width()”设置宽度为10。

然后使用“tie()”将“file”流与“std::cout”流同步,这意味着当我们写入“file”时,也会写入“std::cout”。

写入消息

然后使用“<<”将消息和数字写入文件。然后刷新输出缓冲区以确保数据被写入。

然后检查文件的状态是否良好以及操作是否成功完成。还打印了消息以表示这一点,并关闭了文件。

然后我们声明了一个新的“std::fstream”流对象,名为“inputfile”。我们还以读模式打开这个文件。检查文件的打开情况。还声明了“character”和“line”变量。

读取和打印

使用“get()”从文件中读取一个字符,将其存储在character变量中并打印。使用“clear()”方法还清除了任何潜在的错误标志。

使用“ignore()”忽略了接下来的4个字符,然后使用“get()”打印了下一个字符。

在此之后,使用“seekg()”将位置移动到文件的开头,并使用“peek()”打印下一个字符。然后忽略所有剩余的字符,直到达到换行符,并使用“getline()”读取整行,将其存储在line变量中并打印出来。

最后,关闭文件。输出可以在附带的图像中看到。

这是一个使用c++进行文件处理操作的简单示例,显示了预期的输出。

©jingzhengli.com

总结

c++中涉及许多与文件处理相关的操作。通过理解这些操作,您可以高效地读写文件,并逐行处理文件并持久存储数据。检查文件状态并返回错误代码以有效处理任何问题非常重要。对文件处理的了解还将帮助您将数据与其他系统集成,使其更加健壮。

Written by 小竞 (编辑)

他们称呼我为小竞, 做作为河小马的助理有5年时间了,作为jingzhengli.com的编辑,我关注每天的科技新闻,帮你归纳一些现有科技以及AI产品来提升你的生产力,拥抱AI,让科技和AI为我们服务!