cin,cout对于写C++的来说是再常见不过的一种语法了,但C++的输入输出还是很值得深入的,慢慢补充~
程序端与输入流的连接将流的输出部分存储在程序中,同样程序端与输出流的连接将程序中的数据输出到流的输出部分中。
通常使用缓冲区来高效处理输入输出:
对于硬盘:硬盘通常以块(512字节甚至更多)来传输数据,程序通常以1个字节来处理数据,使用缓冲区来平衡两端的速率。
对于键盘:可以让用户在将输入传输给程序之前返回并更正。
getline的两种用法:
用法1: cin.getline(字符数组(或字符指针), 字符个数n, 终止标志字符)
istream& get(char*,int,char);
istream& get(char*,int,);
istream& getline(char*,int,char);
istream& getline(char*,int);
第一个参数为输入流的输出在程序中储存的位置,第二个参数为多少个字符,第三个参数为分隔符(到此为止)
另外一种用法:要#include,将输入流ss用char分割读取到letter中
getline(stringstream ss,string letter,char);
在刷题中可以利用这个特性,先用stringstream将要分割的字符串转为输入流再用getline进行分割:颠倒字符串中的单词、简化路径
也可以将文件视为一个输入流,比如一个提取编码信息中QP和bit率的代码:
#include <iostream>
#include <fstream>
#include<string>
#include <sstream>
using namespace std;
int main()
{
ofstream qpoutfile("qpout.txt", ios::trunc);
ofstream bitoutfile("bitout.txt", ios::trunc);
ifstream qpinfile("data.txt");
ifstream bitinfile("data.txt");
if (!qpinfile.is_open()&&!bitinfile.is_open())
{
cout << "can not open this file" << endl;
return 0;
}
string letter;
while(getline(qpinfile, letter, ')'))
{
string qp =letter.substr(letter.size()-3);
qpoutfile << qp << endl;
}
while (getline(bitinfile, letter, 'b'))
{
letter.pop_back();//最后的空格去掉
int last_index = letter.find_last_not_of("0123456789");//从末尾向前找到非数字的索引
string bit = letter.substr(last_index + 1);
bitoutfile << bit << endl;
}
qpinfile.close();
bitinfile.close();
qpoutfile.close();
bitoutfile.close();
return 0;
}
注意点:
00,将getline放在while中会不断读txt中每一行,当读到文件尾时进不去while了
01,因此用getline处理文件输入流时最后访问到文件尾,再getline就访问不到新东西了,因此打开两个文件流分别来处理QP和bit
02,getline只会识别换行符与设定的分隔符,会将空格保存起来,因此可能要进行去空格操作
03,letter.find_last_not_of(“0123456789”);//从末尾向前找到非数字的索引
04,substr()若只有一个参数则是该参数为起点,然后一直到尾部
05,匹配应该用正则表达式好些,但不太会正则表达式于是根据该例子的特殊性使用了一些str的库函数
提取结果:
get与getline区别在于get将分隔符保留在输入队列中,而getline不保留
#include <iostream>
#include<string>
using namespace std;
int main()
{
char s[30];
cin.getline(s,10,'#');
cout << s<<endl;
char ch;
cin.get(ch);
cout << ch << endl;
return 0;
}
输入ABCD#E123123132然后再按下回车,此时回车先刷新缓冲区,然后将ABCD#E123123132注入缓冲区,程序此时运行到cin.getline(s,10,'#');
截取ABCD#E123123132的前十个字符并用#分割,将ABCD保存在s中,随后的cin.get(ch);
将读取缓冲区中随后的E读到ch中。