基本概念
- 从键盘到程序 标准输入 input
- 从程序到显示器 标准输出 output
- 标准输入+标准输出=标准I/O
- 文件的输入和输出叫做文件I/O
标准输入输出流的对象
- cerr : 没有缓冲区
- clog 、cin、 cout :有缓冲区
cin
- cin.get() :读取一个字符,返回值是字符,也可以传入形参,读完之后缓冲区就没有这个字符
- cin.get(ch) : 读取一个字符给ch
- cin.get(ch,10) : 读取10个字符(最后一个\0)给ch
char ch[256];
cin.get(ch,3);
cout << ch << endl;
cin.ignore(2);
cin.get(ch,3);
cout << ch << endl;
输入 abcdefg
输出 ab
ef
- cin.getline() : 读取一行的字符,默认遇到换行结束
char ch[10];
cin.get(ch, 5, '5');//遇到‘5’结束,5这个字符还在缓冲区,下次读取的是5
cout << ch << endl;
char c;
cin.get(c);
cout << c << endl;
输入 : 125678
输出 : 12
5
------------------------------------------
char ch[10];
cin.getline(ch, 5, '5');// 5这个字符不在缓冲区,下次读取的是5后面的字符,将5忽略了
cout << ch << endl;
char c;
cin.get(c);
cout << c << endl;
输入 : 125678
输出 : 12
6
- cin.ignore() : 忽略当前字符(从缓冲区取走了),形参表示忽略几个字符,默认一个。
char ch;
cin.get(ch);
cout << ch << endl;
cin.ignore();
cin.get(ch);
cout << ch << endl;
输入 abc
输出 a
c
-
cin.peek() : 返回缓冲区的第一个字符,但是还在缓冲区,就是看一下
-
cin.putback() : get()拿走了,putback再将它放回去。
char ch;
cin.get(ch);
cin.putback(ch);
int number;
cin >> number;
cout << "您输入的数字是:" << number << endl;
结果:输入和输出一样
cout
- cout.flush() : 手动刷新缓冲区
- cout.put() : 向缓冲区输入一个字符
- cout.write() :
格式化输出
5.格式化输出(通过成员)
int number;
cin >> number;
cout.unsetf(ios::dec);//卸载当前的10进制输出
cout.setf(ios::hex);//设置当前为16进制输出
cout.setf(ios::showbase);//16进制前面显示0x 8进制前面显示0
cout.width(6); //设置6位宽
cout.fill('*'); //以~来填充 空
cout.setf(ios::left);//左对齐
cout << number << endl;
6.格式化输出(通过控制符,需要包含头文件iomanip)
cout << hex //16进制输出
<< setiosflags(ios::showbase)//16进制前面显示0x 8进制前面显示0
<< setw(6)//设置6位宽
<< setiosflags(ios::left)//左对齐
<< setfill('*')//以*来填充 空
<< number << endl;//
文本文件输入输出流 ifstream ofstream fstream
const char* path1 = "C:\\Users\\VULCAN\\Desktop\\a.txt";
const char* path2 = "C:\\Users\\VULCAN\\Desktop\\b.txt";
ifstream ism(path1, ios::in);//文件输入流,in 读
ofstream osm(path2, ios::out|ios::app);//文件输出流,out 写,app 追加的方式
if (!ism)//内部有重载
{
cout << "打开文件失败" << endl;
}
char ch;
while (ism.get(ch))
{
cout << ch;
osm.put(ch);//写到 输出文件流
}
cout << endl;
ism.close();//关闭输入文件
osm.close();
文本模式、二进制模式
- 在linux平台下进行文件读写时,文本模式和二进制模式没有区别
- 在windows下,
(文本模式):
写文件将 换行\n 转化成 回车换行\r\n
读文件将 将回车换行\r\n 转化成 换行\n
(二进制模式)
不进行转化
二进制方式读写文件
- 将对象以二进制读取,保存-> 叫做对象序列化
class Person
{
public:
Person(int age, int name):m_age(age),m_name(name) { }
Person() { }
void show()
{
cout << m_age << " "<< m_name << endl;
}
int m_age;
int m_name;
};
Person p1(20, 10);
Person p2;
const char* path2 = "C:\\Users\\VULCAN\\Desktop\\b.txt";
ofstream osm(path2, ios::out|ios::binary);//out写,binary二进制方式
osm.write((char*)&p1, sizeof(Person));
osm.close();
ifstream ism(path2, ios::in | ios::binary);//读
ism.read((char*)&p2, sizeof(Person));
p2.show();
ism.close();