目录
一. C语言的输入输出方式
二. C++的输入输出
2.1 C++标准IO流
2.2 文件IO流
2.3 字符串IO流
一. C语言的输入输出方式
一般C语言通过scanf和printf来实现输入输出,scanf和printf都需要显示地指定数据类型。同时,C语言还支持fscanf/fprintf以及sscanf/sprintf,它们的功能分别为对文件写入/读取数据,和对字符串写入/读取数据。
为了提高读写数据的效率,将内存中的数据写入磁盘文件时,并不是拿到数据后立刻写入,而是将数据先存储在输出缓冲区中,等缓冲区满了后再集中写入到磁盘文件。从磁盘文件中读取数据同样也要有输入缓冲区作为中间媒介。
二. C++的输入输出
2.1 C++标准IO流
C++中使用cin作为标准输入流,cout作为标准输出流,<<为流插入操作符,>>为流提取操作符。
对于内置内类型,可以直接使用cin/cout配合<</>>执行输入输出,对于自定义类型数据,可以通过重载运算符实现输入和输出。
一般来说:标准输出流为屏幕,标准输入流为键盘。
2.2 文件IO流
- C++分别定义了用于向文件中写数据和从文件中读数据的类:ofstream/ifstream
- 还定义了既支持读数据、也支持写数据的类:iofstream
在实例化上面的类时,我们一般显示地指定其操作的文件的文件名,以及文件的打开方式,文件的打开方式定义在命名空间std::ios_base中,常用的文件打开方式有:in -- 只读、out -- 只写、binary -- 二进制的方式读/写。
支持多种方式打开文件,用|分割,如:std::ios_base::in | std::ios_base::binary表示以二进制的方式读文件内容。
使用上面三个类要包头文件:#include<fstream>
这几个类的成员函数很多,但常用的只有下面三个:
- operator<< -- 向文件中写数据。
- operator>> -- 从文件中读取数据。
- get() -- 从文件中读取单个字符。
下面的代码中定义了名为ManagerStuInfo的类,其中有WriteBinary和ReadBinary函数,实现将struct student中的内容以二进制的方式写进指定文件中。先将winfo对象中的内容写入文件,然后再读取到rinfo对象中。
#include<iostream>
#include<fstream>
#include<string>
struct student
{
std::string name;
int age;
int stuId;
};
class ManagerStuInfo
{
public:
ManagerStuInfo(const char* filename = "test.txt")
: _filename(filename)
{ }
//二进制写文件函数
void WriteBinary(const student& st)
{
std::ofstream ofs(_filename, std::ios_base::out | std::ios_base::binary);
ofs << st.name << std::endl;
ofs << st.age << std::endl;
ofs << st.stuId << std::endl;
}
//二进制读文件函数
void ReadBinary(student& st)
{
std::ifstream ifs(_filename, std::ios_base::in | std::ios_base::binary);
ifs >> st.name;
ifs >> st.age;
ifs >> st.stuId;
}
private:
std::string _filename;
};
int main()
{
//写文件
student winfo = { "zhangsan", 20, 1234 };
ManagerStuInfo msw;
msw.WriteBinary(winfo);
//读文件
student rinfo;
ManagerStuInfo msr;
msr.ReadBinary(rinfo);
std::cout << rinfo.name << std::endl;
std::cout << rinfo.age << std::endl;
std::cout << rinfo.stuId << std::endl;
return 0;
}
2.3 字符串IO流
C++标准库中定义了ostringstream和istringstream,分别用于向字符串中写数据和从字符串中读取格式化的数据。同时还有stringstream既支持字符串写也支持字符串读。
上面三个类被定义在头文件<sstream>中。
字符串IO的类与文件IO的实例化和使用方法与文件IO基本相同,str成员函数的功能是获取stringstream内部的string成员。
#include<iostream>
#include<string>
#include<sstream>
struct student
{
std::string name;
int age;
int stuId;
};
int main()
{
//向字符串写数据
student winfo = { "zhangsan", 20, 1234 };
std::ostringstream oss;
oss << winfo.name << " ";
oss << winfo.age << " ";
oss << winfo.stuId << " ";
//从字符串中读数据
student rinfo;
std::string str = oss.str();
std::istringstream iss(str);
iss >> rinfo.name >> rinfo.age >> rinfo.stuId;
std::cout << rinfo.name << std::endl;
std::cout << rinfo.age << std::endl;
std::cout << rinfo.stuId << std::endl;
return 0;
}