C++中读写文件方法(fstream用法)

news/2024/11/8 22:50:55/

文章目录

  • 前言
  • 一、 打开文件方法
  • 二、读写方法
  • 三、读写文本示例
      • 1、文本文件操作示例:
      • 2、二进制文件读写示例:
  • 总结


前言

日常工作中肯定会用到文件读写操作,C++ STL中 fstream 是一种用于文件读写的流类,它可以方便地对文件进行输入输出操作。本文将详细介绍C++ fstream的使用方法,以及各种常用的函数方法和参数。


一、 打开文件方法

首先,要使用C++ fstream,需要包含头文件,然后创建一个fstream对象,指定要打开的文件名和打开模式。打开模式可以是以下几种:

  • ios::in:以输入模式打开文件,只能进行读操作。
  • ios::out:以输出模式打开文件,只能进行写操作。如果文件不存在,则创建一个新文件;如果文件已存在,则覆盖原有内容。
  • ios::app:以追加模式打开文件,只能进行写操作。如果文件不存在,则创建一个新文件;如果文件已存在,则在原有内容的末尾追加新内容。
  • ios::ate:以定位模式打开文件,可以进行读写操作。如果文件不存在,则创建一个新文件;如果文件已存在,则将文件指针定位到文件末尾。
  • ios::binary:以二进制模式打开文件,可以进行读写操作。这个模式会忽略换行符等特殊字符,按照字节流的方式处理文件。
  • ios::trunc:以截断模式打开文件,只能进行写操作。如果文件不存在,则创建一个新文件;如果文件已存在,则删除原有内容。

以上模式可以用“|”符号组合使用,例如ios::in | ios::binary表示以输入二进制模式打开文件。

例如,以下代码创建了一个fstream对象fs,并以输出追加模式打开了一个名为test.txt的文件:

#include <fstream>
using namespace std;int main()
{fstream fs;fs.open("test.txt", ios::out | ios::app);// 尾部追加的写操作fs.close();return 0;
}

注意,在使用完fstream对象后,需要调用close()函数关闭文件,释放资源。

二、读写方法

在打开文件后,可以使用各种流操作符和函数对文件进行读写操作。例如:

  • <<:向文件写入数据,例如fs << “Hello, world!” << endl;表示向文件写入一行字符串。
  • >>:从文件读取数据,例如fs >> x;表示从文件读取一个整数赋值给变量x。
  • getline():从文件读取一行字符串,例如getline(fs, s);表示从文件读取一行字符串赋值给变量s。

另外,还有一些常用的成员函数和标志位可以用来判断和控制fstream对象的状态。例如:

  • is_open():判断是否成功打开了文件,例如if (fs.is_open())表示如果成功打开了文件,则执行后续操作。
  • good():判断是否正常运行,没有发生错误或到达末尾,例如while (fs.good())表示当正常运行时,则循环执行后续操作。
  • eof():判断是否到达了文件末尾,例如while (!fs.eof())表示当没有到达末尾时,则循环执行后续操作。
  • fail():判断是否发生了非致命性错误(如类型不匹配),例如if (fs.fail())表示如果发生了非致命性错误,则执行后续操作。
  • bad():判断是否发生了致命性错误(如磁盘损坏),例如if (fs.bad())表示如果发生了致命性错误,则执行后续操作。
  • clear():清除错误标志位,恢复正常状态,例如fs.clear();表示清除错误标志位。
  • setstate():设置错误标志位为指定状态,例如fs.setstate(ios::failbit);表示设置错误标志位为非致命性错误状态。

三、读写文本示例

1、文本文件操作示例:

#include <iostream>
#include <fstream>
using namespace std;int main()
{// 创建一个fstream对象,用于读写文件fstream file;// 以读写模式打开一个文本文件,如果不存在则创建file.open("text.txt", ios::in | ios::out | ios::trunc);// 判断文件是否打开成功if (!file.is_open()){cout << "打开文件失败" << endl;return -1;}// 向文件中写入一些内容file << "Hello, world!" << endl;file << "This is a text file." << endl;// 将文件指针移动到文件开头file.seekg(0, ios::beg);// 从文件中读取内容,并显示到屏幕上string line;while (getline(file, line)){cout << line << endl;}// 关闭文件file.close();return 0;
}

2、二进制文件读写示例:

#include <iostream>
#include <fstream>
using namespace std;int main()
{// 创建一个fstream对象,用于读写文件fstream file;// 以读写模式打开一个二进制文件,如果不存在则创建file.open("binary.bin", ios::in | ios::out | ios::binary | ios::trunc);// 判断文件是否打开成功if (!file.is_open()){cout << "打开文件失败" << endl;return -1;}// 向文件中写入一个整数和一个浮点数int a = 123;double b = 3.14;file.write((char *)&a, sizeof(a));file.write((char *)&b, sizeof(b));// 将文件指针移动到文件开头file.seekg(0, ios::beg);// 从文件中读取一个整数和一个浮点数,并显示到屏幕上int c;double d;file.read((char *)&c, sizeof(c));file.read((char *)&d, sizeof(d));cout << c << endl;cout << d << endl;// 关闭文件file.close();return 0;
}

代码解释:

  • close函数不需要参数,用于关闭已经打开的文件。

  • fstream有两个成员函数:write和read,分别用于向二进制文件中写入和读取数据。

  • write函数需要两个参数:一个是要写入的数据的地址,一个是要写入的数据的字节数。例如write((char *)&a, sizeof(a))表示将变量a的值写入到二进制文件中,需要将a的地址转换为char型指针,并用sizeof函数获取a的字节数。

  • read函数也需要两个参数:一个是要存放读取的数据的地址,一个是要读取的数据的字节数。例如read((char *)&c, sizeof©)表示从二进制文件中读取一个整数,并存放到变量c中,需要将c的地址转换为char型指针,并用sizeof函数获取c的字节数。

  • fstream有两个成员函数:seekg和seekp,分别用于移动输入(读)和输出(写)的文件指针。这两个函数都需要两个参数:一个是要移动的偏移量(字节数),一个是参考位置。参考位置可以是以下几种:
    ios::beg:从文件开头开始计算偏移量。
    ios::cur:从当前位置开始计算偏移量。
    ios::end:从文件末尾开始计算偏移量。
    例如seekg(0, ios::beg)表示将输入指针移动到文件开头,seekp(-1, ios::end)表示将输出指针移动到倒数第二个字节处。

  • fstream有两个重载的运算符:<<和>>,分别用于向文本文件中写入和读取数据。这两个运算符可以接受各种基本类型的数据,例如int、double、string等,并自动进行格式转换。例如file << "Hello, world!“表示向文本文件中写入字符串"Hello, world!”,file >> a表示从文本文件中读取一个整数,并存放到变量a中。

  • 特别说明:flush() 方法用于将任何缓冲输出写入文件。 它用于清除缓冲区并将缓冲区中的任何剩余数据写入文件。 当您想要确保在关闭文件之前已将所有数据写入文件时,此方法非常有用。

#include <iostream>
#include <fstream>
using namespace std;int main () {ofstream myfile;myfile.open ("example.txt");myfile << "Writing this to a file.\n";// ...当然通常我们会在循环中这么写myfile.flush();myfile.close();return 0;
}
  • ofstream myfile 相当于 fstream 的 ios::out。ofstream 是 fstream 的一种特殊类型,它只用于写入文件。当您使用 ofstream 打开文件时,它会自动将文件模式设置为 ios::out。这意味着您只能写入文件,而不能读取文件。

  • 同样的,ifstream 是 fstream 的另一种特殊类型,它只用于读取文件。当您使用 ifstream 打开文件时,它会自动将文件模式设置为 ios::in。这意味着您只能读取文件,而不能写入文件。


总结

以上就是C++ fstream的基本使用方法和常用函数和参数的介绍。希望本文能够对你有所帮助。


http://www.ppmy.cn/news/93308.html

相关文章

服务器模型 setsockopt 网络超时检测 广播组播和unix域套接字 5.23

四.服务器模型 1.循环服务器 TCP服务器 TCP服务器端运行后等待客户端的连接请求。 TCP服务器接受一个客户端的连接后开始处理&#xff0c;完成了客户的所有请求后断开连接。 TCP循环服务器一次只能处理一个客户端的请求。 只有在当前客户的所有请求都完成后&#xff0c;服务…

Java-API简析_java.lang.Class类(基于JDK1.8)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/130838927 出自【进步*于辰的博客】 其实我的【Java-API】专栏内的博文对大家来说意义是不大的。…

GATK最佳实践之数据预处理SnakeMake流程

<~生~信~交~流~与~合~作~请~关~注~公~众~号生信探索> 写的数据预处理snakemake流程其实包括在每个单独的分析中比如种系遗传变异和肿瘤变异流程中&#xff0c;这里单独拿出来做演示用&#xff0c;因为数据预处理是通用的&#xff0c;在call变异之前需要处理好数据。 数据…

GPC_UICC Configuration

GPC_UICC Configuration_v2.0.pdf 1 简介 本文档规定了在 ETSI 规范 TS 102 221 [TS 102 221]、TS 102 223 [TS 102 223] 中指定的 UICC 平台上实施 GlobalPlatform 规范的配置要求&#xff0c; TS 102 225 [TS 102 225] 和 TS 102 226 [TS 102 226]。 GlobalPlatform Common …

叮咚音乐门铃芯片方案推荐 WTN6006-8S 低功耗 高性价比

​ 随着物联网技术的不断发展&#xff0c;智能家居已经成为了生活中不可或缺的一部分。作为智能家居中的重要组成部分&#xff0c;门铃同样需要进行智能化升级&#xff0c;在改善用户体验、保障家庭安全方面起到了重要作用。本文将介绍一种基于音乐芯片的叮咚门铃应用方案…

金融、医疗、教育等各场景下小程序SDK的应用

近年来&#xff0c;随着数字经济的飞速发展和移动终端的迅速普及&#xff0c;移动互联网全面覆盖&#xff0c;各类应用服务层出不穷&#xff0c;涵盖了方方面面的生活、工作和学习。 而小程序作为一种轻量级的应用形态&#xff0c;越来越受到开发者和用户的欢迎。为了满足不同行…

Git进阶·GitFlow·壹

文章目录 1 Git进阶——GitFlow工作流程1.1 master与develop分支1.1.1 master1.1.2 develop 1.2 feature分支1.3 Release分支1.4 hotfix分支1.5 GitFlow示例1.5.1 在master上新建dev分支1.5.2 基于dev创建feature分支1.5.3 feature分支上开发业务代码1.5.4 将feature合并到dev1…

【C++】unordered_map unordered_set 练习题

文章目录 unordered系列关联式容器unordered_mapunordered_map的文档介绍unordered_map的构造接口使用: unordered_multimapunorder_map&&unorder_multimap对比:unordered_setunordered_set的文档介绍unordered_set的构造接口使用 unordered_multisetOJ练习961.在长度2…