欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > 【C++ 拓展】ifstream、ofstream、fstream的使用

【C++ 拓展】ifstream、ofstream、fstream的使用

2024/10/25 11:20:19 来源:https://blog.csdn.net/m0_62599305/article/details/134885371  浏览:    关键词:【C++ 拓展】ifstream、ofstream、fstream的使用

文章目录

  • 前言
  • 一、istream
    • 1.1 ifstream - 输入流
    • 1.2 具体使用
      • 构造函数
      • 成员函数
        • open 函数:
        • is_open 函数:
        • close 函数:
        • operator>> 重载:
        • rdbuf 函数
        • peek 函数
        • read 函数
        • getline 函数
        • ignore 函数
        • seekg 函数
        • tellg 函数
  • 二、ofstream 类
    • 1.1 构造函数
    • 1.2 函数成员
      • write 函数
  • 总结


前言

在C++编程中,文件操作是一项常见而重要的任务。为了更便捷地进行文件读写操作,C++提供了三个关键的文件流类:ifstream、ofstream和fstream。这三个类分别用于输入、输出以及读写文件。通过它们,我们能够轻松地处理文件的打开、读取、写入和关闭等操作,为程序员提供了便利的文件处理工具。

在本文中,我们将深入探讨这三个文件流类的基本用法,介绍它们的构造函数、常用成员函数以及一些实际应用示例,以帮助读者更好地理解和运用这些文件流类。


一、istream

1.1 ifstream - 输入流

ifstream 类用于从文件中读取数据,即用于输入流的文件操作。“i” 代表 “input”(输入)。
这个类继承自 istream,允许你从文件中读取数据,就像从键盘输入一样。
你可以使用 ifstream 打开文件并从中读取数据,但不能写入或更改文件的内容。
示例用途包括读取配置文件、文本文件等。

1.2 具体使用

构造函数

explicit ifstream(const char* filename, ios_base::openmode mode = ios_base::in);

参数:
filename:要打开的文件的名称。
mode:文件打开模式,默认为输入模式(ios_base::in)。

成员函数

open 函数:
void open(const char* filename, ios_base::openmode mode = ios_base::in);

参数:
filename:要打开的文件的名称。
mode:文件打开模式,默认为输入模式(ios_base::in)。
功能:打开指定的文件。

is_open 函数:
bool is_open() const;

返回值:如果文件已成功打开,则返回 true;否则返回 false。

功能:检查文件是否已经打开。

close 函数:
void close();

功能:关闭已打开的文件。

operator>> 重载:
istream& operator>>(Type& val);

参数:Type 表示要读取的数据类型。

返回值:返回输入流对象的引用。

功能:从文件中读取数据。

rdbuf 函数
streambuf* rdbuf() const;

功能: 获取与流关联的底层缓冲区的指针。
返回值: 指向底层缓冲区的指针。

peek 函数
int peek();

功能: 返回下一个字符,但不提取它。
返回值: 下一个字符的 ASCII 值,如果到达文件末尾则返回 EOF。

read 函数
istream& read(char* s, streamsize n);

功能: 从流中读取最多 n 个字符到数组 s。
参数:
s:指向存储读取字符的缓冲区的指针。
n:要读取的字符数。
返回值: 一个引用到流对象,用于链式操作。

getline 函数
istream& getline(char* s, streamsize n, char delim);

功能: 从流中读取字符,直到遇到指定的分隔符 delim 或读取了最多 n 个字符为止。
参数:
s:指向存储读取字符的缓冲区的指针。
n:要读取的字符数。
delim:分隔符。
返回值: 一个引用到流对象,用于链式操作。

ignore 函数
istream& ignore(streamsize n = 1, int delim = EOF);

功能: 从流中提取并丢弃字符,直到读取了 n 个字符或遇到指定的分隔符 delim。
参数:
n:要忽略的字符数。
delim:分隔符。
返回值: 一个引用到流对象,用于链式操作。

seekg 函数
istream& seekg(streampos pos);

功能: 设置文件指针的位置。
参数:
pos:新的文件指针位置。可以直接填数字
返回值: 一个引用到流对象,用于链式操作。

streampos 是 C++ 标准库中定义的一种类型,通常用于处理流(stream)的位置信息。在 C++ 中,流是与输入和输出设备(例如文件、标准输入/输出、字符串等)进行数据交互的抽象概念。streampos 实际上是一个类型定义,用于表示流在特定位置的位置信息。

这个类型通常被用作输入输出流的位置指示器。在处理文件或其他类型的流时,你可能需要跟踪当前读取或写入位置,这就是 streampos 起作用的地方。它可以记录特定流的位置,允许你在之后能够定位到这个位置,读取或写入数据,或者直接操作这个位置的内容。

streampos 的具体实现可能因不同的编译器或库而有所不同,但通常它是一个整数类型(比如 long long 或 streamoff),用于表示相对于流起始位置的偏移量或者一个指针,指向流中的特定位置。

在 C++ 中,常用的流类(比如 ifstream、ofstream、stringstream 等)都提供了方法来获取和设置流的位置,通常使用 tellg() 和 seekg() 方法来获取和设置输入流位置,使用 tellp() 和 seekp() 方法来获取和设置输出流位置。这些方法返回或接受 streampos 类型的参数,用于标识流的位置。

总的来说,streampos 是 C++ 中用于表示流位置的类型,可以帮助你管理和操作输入输出流的位置信息。

tellg 函数
streampos tellg();

功能: 获取当前文件指针的位置。
返回值: 当前文件指针的位置。

二、ofstream 类

1.1 构造函数

explicit ofstream(const char* filename, ios_base::openmode mode = ios_base::out);

功能: 构造一个 ofstream 对象,用于向指定文件 filename 写入数据。
参数:
filename:文件的路径和名称。
mode:打开文件的模式,默认为输出模式 (ios_base::out)。

1.2 函数成员

write 函数

ostream& write(const char* s, streamsize n);

功能: 将字符数组 s 中的 n 个字符写入流。
参数:
s:指向要写入的字符数组的指针。
n:要写入的字符数。
返回值: 一个引用到流对象,用于链式操作。
seekp 函数
cpp
ostream& seekp(streampos pos);
功能: 设置文件指针的位置。
参数:
pos:新的文件指针位置。
返回值: 一个引用到流对象,用于链式操作。
tellp 函数
cpp
streampos tellp();
功能: 获取当前文件指针的位置。
返回值: 当前文件指针的位置。
fstream 类
构造函数
cpp
explicit fstream(const char* filename, ios_base::openmode mode = ios_base::in | ios_base::out);
功能: 构造一个 fstream 对象,用于对指定文件 filename 进行读写操作。
参数:
filename:文件的路径和名称。
mode:打开文件的模式,默认为输入输出模式 (ios_base::in | ios_base::out)。


总结

文件流是C++中处理文件输入输出的重要工具,而ifstream、ofstream和fstream则是其核心代表。通过本文的介绍,我们了解了它们的基本构造函数、常用成员函数,以及如何在实际编程中应用它们来处理文件。

ifstream 用于读取文件内容,适用于处理输入操作。
ofstream 用于写入文件内容,是处理输出操作的理想选择。
fstream 则可以同时用于读写文件,为灵活的文件操作提供了支持。
无论是读取配置文件、保存用户数据还是进行其他文件相关的操作,这三个文件流类都能够满足各种需求。通过灵活运用它们,程序员能够更高效地处理文件操作,为C++程序的开发提供了强大的支持。希望本文的内容对您在C++文件操作的学习和实践中有所帮助。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com