「C++系列」文件和流
【人工智能教程】,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。
点击跳转到网站:【人工智能教程】
文章目录
- 一、文件和流
- 1. 文件操作
- ① 打开文件
- ② 读写文件
- 2. 流操作
- 二、应用场景
- 1. 日志记录
- 2. 数据持久化
- 3. 配置文件读写
- 三、相关链接
一、文件和流
在C++中,文件和流是处理输入/输出(I/O)操作的两个核心概念。文件是存储在硬盘上的数据集合,而流则是一种抽象的数据源或数据目的地,用于数据的输入或输出。C++标准库提供了丰富的类和函数来支持文件和流的操作。
1. 文件操作
在C++中,文件操作通常通过<fstream>
库中的类来实现,主要包括ifstream
(用于从文件读取数据)、ofstream
(用于向文件写入数据)和fstream
(同时支持读写操作)。
数据类型 | 描述 |
---|---|
ofstream | 该数据类型表示输出文件流,用于创建文件并向文件写入信息。 |
ifstream | 该数据类型表示输入文件流,用于从文件读取信息。 |
fstream | 该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。 |
① 打开文件
使用这些类之前,你需要使用它们的open
成员函数来打开文件。如果文件成功打开,open
函数会返回true
。
模式标志 | 描述 |
---|---|
ios::app | 追加模式。所有写入都追加到文件末尾。 |
ios::ate | 文件打开后定位到文件末尾。 |
ios::in | 打开文件用于读取。 |
ios::out | 打开文件用于写入。 |
ios::trunc | 如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为 0。 |
#include <fstream>
#include <iostream>
int main() {
std::ifstream infile("example.txt");
if (!infile.is_open()) {
std::cerr << "Failed to open file" << std::endl;
return 1;
}
// ... 读取文件内容
infile.close();
std::ofstream outfile("output.txt");
if (!outfile.is_open()) {
std::cerr << "Failed to open file" << std::endl;
return 1;
}
// ... 写入文件内容
outfile.close();
return 0;
}
② 读写文件
对于ifstream
,你可以使用>>
运算符或getline()
函数来读取数据。对于ofstream
,你可以使用<<
运算符来写入数据。
std::string line;
while (getline(infile, line)) {
// 处理每一行
}
outfile << "Hello, World!" << std::endl;
2. 流操作
在C++中,流不仅限于文件操作。标准库还提供了其他类型的流,如cin
(标准输入流)、cout
(标准输出流)和cerr
(标准错误输出流),它们分别用于从标准输入读取数据、向标准输出写入数据和向标准错误输出写入数据。
流操作非常灵活,支持多种数据类型和格式化输出。例如,你可以使用std::setw
和std::setprecision
等I/O操纵符来控制输出格式。
#include <iostream>
#include <iomanip> // 用于格式化输出
int main() {
double pi = 3.141592653589793;
std::cout << std::fixed << std::setprecision(2) << pi << std::endl; // 输出: 3.14
return 0;
}
二、应用场景
C++中文件和流的应用场景非常广泛,包括但不限于日志记录、数据持久化、配置文件读写、用户输入/输出等。下面我将提供几个具体的应用场景及其案例代码。
1. 日志记录
日志记录是应用程序中非常重要的一部分,用于跟踪程序的运行情况、调试信息或用户行为等。
案例代码:
#include <fstream>
#include <iostream>
#include <string>
#include <chrono>
#include <iomanip>
void logMessage(const std::string& message) {
std::ofstream logFile("app.log", std::ios::app); // 使用append模式
if (logFile.is_open()) {
auto now = std::chrono::system_clock::now();
auto in_time_t = std::chrono::system_clock::to_time_t(now);
std::stringstream ss;
ss << std::put_time(std::localtime(&in_time_t), "%Y-%m-%d %X") << ": " << message << std::endl;
logFile << ss.str();
logFile.close();
}
}
int main() {
logMessage("Application started.");
// 模拟一些操作...
logMessage("An error occurred.");
return 0;
}
2. 数据持久化
数据持久化是指将程序中的数据保存到存储设备上,以便在程序终止后数据仍然可以恢复和使用。
案例代码:
#include <fstream>
#include <iostream>
#include <vector>
void saveData(const std::string& filename, const std::vector<int>& data) {
std::ofstream outfile(filename, std::ios::binary);
if (outfile.is_open()) {
for (int num : data) {
outfile.write(reinterpret_cast<const char*>(&num), sizeof(num));
}
outfile.close();
}
}
void loadData(const std::string& filename, std::vector<int>& data) {
std::ifstream infile(filename, std::ios::binary);
if (infile.is_open()) {
int num;
while (infile.read(reinterpret_cast<char*>(&num), sizeof(num))) {
data.push_back(num);
}
infile.close();
}
}
int main() {
std::vector<int> data = {1, 2, 3, 4, 5};
saveData("data.bin", data);
std::vector<int> loadedData;
loadData("data.bin", loadedData);
for (int num : loadedData) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
3. 配置文件读写
配置文件是应用程序中用于存储配置信息的文件,如数据库连接信息、程序设置等。
案例代码(使用简单的文本格式):
#include <fstream>
#include <iostream>
#include <sstream>
#include <map>
std::map<std::string, std::string> readConfig(const std::string& filename) {
std::map<std::string, std::string> config;
std::ifstream infile(filename);
std::string line;
if (infile.is_open()) {
while (getline(infile, line)) {
size_t pos = line.find('=');
if (pos != std::string::npos) {
std::string key = line.substr(0, pos);
std::string value = line.substr(pos + 1);
config[key] = value;
}
}
infile.close();
}
return config;
}
int main() {
auto config = readConfig("config.txt");
for (const auto& pair : config) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
return 0;
}
三、相关链接
- Visual Studio Code下载地址
- Sublime Text下载地址
- 「C++系列」C++简介、应用领域
- 「C++系列」C++ 基本语法
- 「C++系列」C++ 数据类型
- 「C++系列」C++ 变量类型
- 「C++系列」C++ 变量作用域
- 「C++系列」C++ 常量知识点-细致讲解
- 「C++系列」C++ 修饰符类型
- 「C++系列」一篇文章说透【存储类】
- 「C++系列」一篇文章讲透【运算符】
- 「C++系列」循环
- 「C++系列」判断
- 「C++系列」函数/内置函数
- 「C++系列」数字/随机数
- 「C++系列」数组
- 「C++系列」字符串
- 「C++系列」指针
- 「C++系列」引用
- 「C++系列」日期/时间
- 「C++系列」输入/输出
- 「C++系列」数据结构
- 「C++系列」vector 容器
- 「C++系列」类/对象
- 「C++系列」继承
- 「C++系列」重载运算符/重载函数
- 「C++系列」多态
- 「C++系列」数据抽象
- 「C++系列」数据封装
- 「C++系列」 接口(抽象类)