C语言的输入和输出
流是什么
C++IO流
C++标准IO流
C++ 标准 IO 流(Standard IO Streams)是 C++ 提供的一组用于输入和输出操作的流类。标准 IO 流主要分为四种类型:标准输入流、标准输出流、标准错误流和标准日志流。下面是每种类型的详细说明:
标准输入流(Standard Input Stream)
标准输入流用于从标准输入设备(通常是键盘)读取数据。
- 类名:
std::istream
- 对象:
std::cin
示例代码:
#include <iostream>
using namespace std;
int main() {
int number;
cout << "Enter a number: ";
cin >> number;
cout << "You entered: " << number << endl;
return 0;
}
标准输出流(Standard Output Stream)
标准输出流用于向标准输出设备(通常是屏幕)写入数据。
- 类名:
std::ostream
- 对象:
std::cout
示例代码:
#include <iostream>
using namespace std;
int main() {
cout << "Hello, World!" << endl;
return 0;
}
标准错误流(Standard Error Stream)
标准错误流用于向标准错误设备(通常也是屏幕)写入错误信息。
- 类名:
std::ostream
- 对象:
std::cerr
示例代码:
#include <iostream>
using namespace std;
int main() {
cerr << "An error occurred!" << endl;
return 0;
}
标准日志流(Standard Log Stream)
标准日志流用于向标准输出设备写入日志信息,但和 std::cout
不同,std::clog
通常用于输出程序运行时的日志信息。
- 类名:
std::ostream
- 对象:
std::clog
示例代码:
#include <iostream>
using namespace std;
int main() {
clog << "This is a log message." << endl;
return 0;
}
C++文件IO流
文件操作步骤
C++根据文件内容的数据格式将文件分为二进制文件和文本文件,采用文件流对象操作文件的一般步骤如下:
1、定义一个文件流对象。
操作文件的类有以下三个:
2、使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系。
文件常见的打开方式如下:
3、使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写。
对文件进行提取和插入操作的常用成员函数:
4、关闭文件。
以二进制的形式操作文件
以二进制的形式对文件进行写入操作:
//以二进制的形式对文件进行写入
void WriteBinary()
{
ofstream ofile; //定义文件流对象
ofile.open("test.bin", ofstream::out | ofstream::binary); //以二进制写入的方式打开test.bin文件
char data[] = "2021dragon";
ofile.write(data, strlen(data)); //将data字符串写入文件
ofile.put('!'); //将字符'!'写入文件
ofile.close(); //关闭文件
}
以二进制的形式对文件进行读取操作:
//以二进制的形式对文件进行读取
void ReadBinary()
{
ifstream ifile; //定义文件流对象
ifile.open("test.bin", ofstream::in | ofstream::binary); //以二进制读取的方式打开test.bin文件
ifile.seekg(0, ifile.end); //跳转到文件末尾
int length = ifile.tellg(); //获取当前字符在文件当中的位置,即文件的字符总数
ifile.seekg(0, ifile.beg); //重新回到文件开头
char data[100];
ifile.read(data, length); //将文件当中的数据全部读取到字符串data当中
ifile.close(); //关闭文件
}
以文本的形式操作文件
以文本的形式对文件进行写入操作:
//以文本的形式对文件进行读取
void ReadTxt()
{
ifstream ifile; //定义文件流对象
ifile.open("test.txt"); //以读取的方式打开test.txt文件
ifile.seekg(0, ifile.end); //跳转到文件末尾
int length = ifile.tellg(); //获取当前字符在文件当中的位置,即文件的字符总数
ifile.seekg(0, ifile.beg); //重新回到文件开头
char data[100];
ifile.read(data, length); //将文件当中的数据全部读取到字符串data当中
cout << length << endl;
cout << data << endl;
ifile.close(); //关闭文件
}
注意: 使用ofstream类对象的open函数时,若不指定打开方式,则默认以写的方式打开文件;使用ifstream类对象的open函数时,若不指定打开方式,则默认以读的方式打开文件;使用fstream类对象的open函数时,若不指定打开方式,则默认以写+读的方式打开文件。
使用>>和<<对文件进行操作
使用>>和<<运算符对文件进行读写操作,会变得很简单,也很形象。
对文件进行写入操作:
//对文件进行写入操作
void WriteFile()
{
ofstream ofs("data.txt"); //定义文件流对象,并打开文件
ofs << "2021dragon!"; //字符串“流入”文件
ofs.close(); //关闭文件
}
对文件进行读取操作:
//对文件进行读取操作
void ReadFile()
{
ifstream ifs("data.txt"); //定义文件流对象,并打开文件
char data[100];
ifs >> data; //文件数据“流入”字符串data
ifs.close(); //关闭文件
}
注意: 可以在定义文件流对象的同时指定将要打开的文件名,以及文件的打开方式。
stringstream的简单介绍
stringstream
是 C++ 标准库中的一个类,用于在内存中操作字符串流。它是 std::stringstream
类的实例,通过它可以实现字符串的输入输出操作,类似于 std::cin
和 std::cout
的功能,但作用于字符串而不是控制台或文件。
stringstream
类
stringstream
是一个模板类,继承自 std::basic_stringstream
。它位于 <sstream>
头文件中,提供了一组方便的方法来进行字符串的格式化输入和输出操作。
常用操作
- 插入操作符 (
<<
): 将数据插入到字符串流中。 - 提取操作符 (
>>
): 从字符串流中提取数据。
主要方法
str()
: 获取或设置流的内容。clear()
: 清除流的状态标志。seekg()
和seekp()
: 设置输入和输出位置。
使用示例
插入数据
可以使用插入操作符 <<
将各种类型的数据插入到 stringstream
对象中。
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::stringstream ss;
ss << "Number: " << 42 << ", String: " << "Hello";
std::string result = ss.str();
std::cout << result << std::endl; // Output: Number: 42, String: Hello
return 0;
}
提取数据
可以使用提取操作符 >>
从 stringstream
对象中提取数据。
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::string input = "42 Hello";
std::stringstream ss(input);
int number;
std::string text;
ss >> number >> text;
std::cout << "Number: " << number << ", Text: " << text << std::endl; // Output: Number: 42, Text: Hello
return 0;
}
其他方法
str()
: 可以获取当前流的内容,也可以设置新的内容。clear()
: 可以重置流的状态标志。
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::stringstream ss;
ss << "123 456";
int num1, num2;
ss >> num1 >> num2;
// 清除状态标志
ss.clear();
// 设置新的内容
ss.str("789 012");
ss >> num1 >> num2;
std::cout << "Num1: " << num1 << ", Num2: " << num2 << std::endl; // Output: Num1: 789, Num2: 12
return 0;
}
优点
- 格式化方便: 可以像使用
std::cout
和std::cin
一样进行格式化输出和输入。 - 灵活性: 可以随时获取或设置字符串内容。
- 类型安全: 通过操作符重载,能够处理各种数据类型。
stringstream
提供了一种灵活且类型安全的方法来处理内存中的字符串数据,在需要进行复杂的字符串格式化和解析时非常有用。