文件输入输出

发布于:2025-06-29 ⋅ 阅读:(20) ⋅ 点赞:(0)

写在前面

本文为博主复习笔记,希望对读者有所帮助。

概述

头文件:fstream。

三个类:

  • ifstream,读
  • ofstream,写
  • fstream,读写

在学习文件输入输出时,应该和之前学过的IO类关联起来。

fstream 特有操作表

操作/函数 说明
fstream fstrm; 创建一个未绑定的文件流对象
fstream fstrm(s); 创建文件流并打开名为 s 的文件
fstream fstrm(s, mode); 以指定模式 mode 打开文件 s
fstrm.open(s) 打开名为 s 的文件并将文件与 fstrm 绑定
fstrm.open(s, mode) 以指定模式 mode 打开文件 s
fstrm.close() 关闭与 fstrm 绑定的文件
fstrm.is_open() 返回 bool 值,指示关联文件是否成功打开

模式组合示例

组合 等效效果
ios::out | ios::trunc 打开文件并截断(默认输出模式)
ios::out | ios::app 打开文件追加写入
ios::in | ios::out 打开文件可读写
ios::in | ios::out | ios::trunc 打开文件可读写并截断

有了上面三个表,我们看看如何使用文件流对象。

使用文件流对象

当我们想要读写一个文件时,可以定义一个文件流对象,并将对象与文件流关联起来。

#include <iostream>
#include <fstream>
#include <string>

const std::string FileName{ "test.txt" };

void test_ostream()
{
	std::ofstream out("test.txt");//默认的写入指针是位于文件头的
	if (!out.is_open())
	{
		std::cerr << "打开文件失败" << std::endl;
		out.close();
		return;
	}
	else
		std::cout << "打开文件成功" << std::endl;

	std::string str{ "测试\n文本" };
	std::cout << "向文件写入内容:" << str << std::endl;
	out << str << std::endl;//<<操作符遇到换行符或者空格符不会停止写入
	out.close();
}

void test_ifstream()
{
	std::ifstream in("test.txt");
	if (!in.is_open())
	{
		std::cerr << "读取文件失败\n";
		in.close();
		return;
	}
	std::cout << "打开文件成功" << std::endl;
	std::string fileBuf;
	while (in>>fileBuf) //文本中有换行时,直接读取不会换行
		std::cout<<fileBuf<<std::endl;//所以需要加上endl
	std::cout << fileBuf;
	in.close();
}

上述代码展示了文件输入、输出流的基本使用方式。当一个文件流对象被销毁时,会自动调用close

文件模式

模式标志 说明
ios::in 以读方式打开
ios::out 以写方式打开
ios::app 每次写操作前定位到文件末尾
ios::ate 打开文件后立即定位到文件末尾
ios::trunc 截断文件
ios::binary 以二进制方式进行IO

当我们未指定文件模式时,不同的文件流类型有默认的文件模式:

文件流类型 默认模式 等效显式模式 说明
ifstream ios::in ios::in 只读方式打开文件
ofstream ios::out ios::out | ios::trunc 写入方式打开并截断文件
fstream 无默认模式 - 必须显式指定模式

补充说明

  1. ifstream 细节

    • 如果文件不存在,打开会失败
    • 可以添加 ios::binary 模式进行二进制读取
  2. ofstream 细节

    • 如果文件不存在,会创建新文件
    • 如果文件存在,默认会清空文件内容
    • 可以添加 ios::app 模式改为追加写入
  3. fstream 细节

    • 必须显式指定至少 ios::inios::out 之一
    • 常见组合:
      • ios::in \| ios::out:可读可写(不截断)
      • ios::in \| ios::out \| ios::trunc:可读可写并截断
      • ios::in \| ios::out \| ios::app:可读可追加写入
  4. 模式继承关系

    • ios::inios::out 是基础模式
    • ios::truncios::app 是修饰模式
    • ios::binary 是独立模式,可与任何模式组合

文件模式有如下使用限制:

  1. 基本限制

    • 必须至少指定 inout 模式之一
    • 不能同时指定 truncapp 模式(互斥)
  2. ifstream 限制

    • 只能使用 in 模式(默认)
    • 可以组合 binary 模式
    • 不能使用 outtruncapp 模式
  3. ofstream 限制

    • 默认使用 out|trunc 模式
    • 可以组合 app 模式(但不能与 trunc 同时使用)
    • 可以组合 binary 模式
    • 不能单独使用 in 模式
  4. fstream 限制

    • 默认无模式(需要显式指定)
    • 可以组合 inout 模式
    • 可以组合 truncapp 模式(但不能同时)
    • 可以组合 binary 模式
  5. 特殊限制

    • out 模式打开但不指定 apptrunc 时:
      • 如果文件存在,内容不会被自动截断
      • 如果文件不存在,会创建新文件
    • ate 模式只影响初始位置,不影响写入行为
    • binary 模式必须显式指定,否则默认为文本模式
  6. 错误情况

    • in 模式打开不存在的文件会失败
    • trunc 模式打开但未指定 out 会失败
    • 对只读文件(系统权限)尝试 out 模式会失败
    • 对只写文件(系统权限)尝试 in 模式会失败

网站公告

今日签到

点亮在社区的每一天
去签到