(C++) 文件读写基础
🗂️前言
📄ref
📄访问标记
🗃️流打开模式类型
常量 | 描述 |
---|---|
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 == 1
char buf[1024] = {};
while (ifs >> buf) {
std::cout << buf << std::endl;
}
#elif CASE == 2
char buf[1024] = {};
while (ifs.getline(buf, sizeof(buf))) {
std::cout << buf << std::endl;
}
#elif CASE == 3
std::string buf;
while (std::getline(ifs, buf)) {
std::cout << buf << std::endl;
}
#elif CASE == 4
int ch;
while ((ch = ifs.get()) != EOF) {
std::cout << (char)ch;
}
std::cout << std::endl;
#elif CASE == 5
char buf[1024] = {};
while (ifs.read(buf, sizeof(buf))) {
std::cout << buf << std::endl;
}
#endif
std::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
原文地址:https://blog.csdn.net/CUBE_lotus/article/details/140621297
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!