文章目录
- 🗂️前言
- 📄ref
- 📄访问标记
- 🗃️流打开模式类型
- 🗂️Code
- 📄demo
- 📄分点讲解
- 🗃️打开/关闭
- 🗃️写
- 🗃️读
- 🗃️状态函数
- 🗂️END
- 🌟关注我
🗂️前言
📄ref
- std::basic_fstream - cppreference.com
- std::basic_ifstream - cppreference.com
- std::basic_ofstream - cppreference.com
📄访问标记
🗃️流打开模式类型
std::ios_base::openmode - cppreference.com
常量 | 描述 |
---|---|
app | 每次写入前寻位到流结尾 |
binary | 以二进制模式打开 |
in | 为读打开 |
out | 为写打开 |
trunc | 在打开时舍弃流的内容 |
ate | 打开后立即寻位到流结尾 |
noreplace (C++23) | 以独占模式打开 |
🗂️Code
📄demo
#include <cstring>
#include <fstream>
#include <iostream>void check_io(std::ios& io) {if (io.good()) {std::cerr << " io is good." << std::endl;}if (io.fail()) {std::cerr << " io is fail." << std::endl;}if (io.bad()) {std::cerr << " io is bad." << std::endl;}if (io.eof()) {std::cerr << " io is eof." << std::endl;}io.clear();
}void file_write(std::string file_path) {std::ofstream ofs;ofs.open(file_path, std::ios::out);if (!ofs.is_open()) {std::cerr << "File Open Error" << std::endl;return;}char msg[] = "https://space.bilibili.com/8172252";ofs << "cuber-lotus" << std::endl;for (char ch : {'u', 'r', 'l', ':'}) {ofs.put(ch);}ofs.write(msg, strlen(msg));std::cout << __func__;check_io(ofs);ofs.close();
}void file_read(std::string file_path) {std::ifstream ifs;ifs.open(file_path, std::ios::in);if (!ifs.is_open()) {std::cerr << "File Open Error" << std::endl;return;}#define CASE 1#if CASE == 1char buf[1024] = {};while (ifs >> buf) {std::cout << buf << std::endl;}
#elif CASE == 2char buf[1024] = {};while (ifs.getline(buf, sizeof(buf))) {std::cout << buf << std::endl;}
#elif CASE == 3std::string buf;while (std::getline(ifs, buf)) {std::cout << buf << std::endl;}
#elif CASE == 4int ch;while ((ch = ifs.get()) != EOF) {std::cout << (char)ch;}std::cout << std::endl;
#elif CASE == 5char buf[1024] = {};while (ifs.read(buf, sizeof(buf))) {std::cout << buf << std::endl;}
#endifstd::cout << __func__;check_io(ifs);ifs.close();
}int main() {const std::string file_path = "example.txt";file_write(file_path);file_read(file_path);
}
📄分点讲解
C++用类封装了流式操作,使用体验是更加丰富,更加多。
🗃️打开/关闭
// fstream 可以同时管理 i/o
std::fstream fs;
fs.open(file_path, std::ios::out | std::ios::in);
if (!fs.is_open()) {std::cerr << "File Open Error" << std::endl;return;
}
fs.close();
🗃️写
法1:
ofs << "cuber-lotus" << std::endl;
法2:
char msg[] = "https://space.bilibili.com/8172252";
ofs.write(msg, strlen(msg));
法3:
ofs.put(ch);
🗃️读
法1:
char buf[1024] = {};
while (ifs >> buf) {std::cout << buf << std::endl;
}
法2:
char buf[1024] = {};
while (ifs.getline(buf, sizeof(buf))) {std::cout << buf << std::endl;
}
法3:
std::string buf;
while (std::getline(ifs, buf)) {std::cout << buf << std::endl;
}
法4:
int ch;
while ((ch = ifs.get()) != EOF) {std::cout << (char)ch;
}
std::cout << std::endl;
法5:
char buf[1024] = {};
while (ifs.read(buf, sizeof(buf))) {std::cout << buf << std::endl;
}
🗃️状态函数
状态函数 | |
---|---|
good | 检查是否没有发生错误,即是否可执行输入/输出操作 (std::basic_ios<CharT,Traits> 的公开成员函数) |
eof | 检查是否到达了文件末尾 (std::basic_ios<CharT,Traits> 的公开成员函数) |
fail | 检查是否发生了可恢复的错误 (std::basic_ios<CharT,Traits> 的公开成员函数) |
bad | 检查是否已发生不可恢复的错误 (std::basic_ios<CharT,Traits> 的公开成员函数) |
operator! | 检查是否有错误发生(fail() 的同义词) (std::basic_ios<CharT,Traits> 的公开成员函数) |
operator bool | 检查是否没有发生错误(! fail() 的同义词) (std::basic_ios<CharT,Traits> 的公开成员函数) |
rdstate | 返回状态标志 (std::basic_ios<CharT,Traits> 的公开成员函数) |
setstate | 设置状态标志 (std::basic_ios<CharT,Traits> 的公开成员函数) |
clear | 修改状态标志 (std::basic_ios<CharT,Traits> 的公开成员函数) |
🗂️END
🌟关注我
关注我,学习更多C/C++,算法,计算机知识
B站:
👨💻主页:天赐细莲 bilibili