文章目录
C++ I/O流详解
C++的I/O流(输入/输出流)为处理输入和输出操作提供了一种强大且灵活的方式。它们是C++标准库的一部分,能够让程序从不同的来源读取数据并向各种目的地写入数据,比如控制台、文件,甚至是内存缓冲区。在C++中掌握I/O流的使用,对于高效地处理数据输入输出至关重要。
1. C++ I/O流基础
C++的I/O流基于“流”的概念,流可以理解为数据从输入设备(如键盘、文件等)到程序或从程序到输出设备(如屏幕、文件等)传输的途径。
C++主要有三种标准流:
std::cin
:标准输入流,通常与键盘绑定,用于从用户处获取输入。std::cout
:标准输出流,通常与显示器绑定,用于向用户输出信息。std::cerr
:标准错误流,用于输出错误信息,通常不会经过缓冲。
这些流的核心是基于两个类:istream
和ostream
。其中,istream
处理输入流,ostream
处理输出流。
2. 输入输出流的基本操作
输入流(std::cin
)
std::cin
用于从标准输入设备(如键盘)读取数据。最常见的方式是使用 >>
操作符。例如:
#include <iostream>
int main() {
int age;
std::cout << "请输入您的年龄:";
std::cin >> age; // 读取输入
std::cout << "您的年龄是:" << age << std::endl;
return 0;
}
输出流(std::cout
)
std::cout
用于向标准输出设备(如屏幕)打印数据,通常通过 <<
操作符。例如:
#include <iostream>
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}
在这个例子中,<<
将字符串 "Hello, World!"
发送到输出流 std::cout
,并最终显示在屏幕上。
3. 文件I/O操作
文件流是C++中另一个常用的I/O操作类型。文件流提供了从文件中读取和向文件写入数据的功能。文件流使用fstream
类,派生自ifstream
(输入文件流)和ofstream
(输出文件流)。
读取文件(ifstream
)
以下是一个简单的文件读取示例:
#include <iostream>
#include <fstream>
int main() {
std::ifstream infile("example.txt");
if (!infile) {
std::cerr << "无法打开文件" << std::endl;
return 1;
}
std::string line;
while (std::getline(infile, line)) {
std::cout << line << std::endl; // 输出每一行
}
infile.close(); // 关闭文件
return 0;
}
写入文件(ofstream
)
写入文件同样简单:
#include <iostream>
#include <fstream>
int main() {
std::ofstream outfile("output.txt");
if (!outfile) {
std::cerr << "无法创建文件" << std::endl;
return 1;
}
outfile << "这是输出的第一行\n";
outfile << "这是输出的第二行\n";
outfile.close(); // 关闭文件
return 0;
}
4. 流的格式化
C++提供了丰富的格式化选项来控制数据的显示。例如,可以通过std::fixed
、std::setprecision
来控制小数点的位数。
#include <iostream>
#include <iomanip>
int main() {
double pi = 3.141592653589793238;
std::cout << std::fixed << std::setprecision(4);
std::cout << "Pi = " << pi << std::endl; // 输出 Pi = 3.1416
return 0;
}
5. 缓冲与刷新
默认情况下,C++的输出流是带有缓冲区的。也就是说,输出操作不会立即显示到屏幕上,而是先存储在缓冲区中,直到缓冲区满了或显示新行字符('\n'
)时才会刷新缓冲区。可以使用std::flush
强制刷新缓冲区。
#include <iostream>
int main() {
std::cout << "这行不会立即输出";
std::cout.flush(); // 强制刷新缓冲区,立即输出
return 0;
}