c++的输入输出

cin,cout对于写C++的来说是再常见不过的一种语法了,但C++的输入输出还是很值得深入的,慢慢补充~
在这里插入图片描述
程序端与输入流的连接将流的输出部分存储在程序中,同样程序端与输出流的连接将程序中的数据输出到流的输出部分中。
通常使用缓冲区来高效处理输入输出:
对于硬盘:硬盘通常以块(512字节甚至更多)来传输数据,程序通常以1个字节来处理数据,使用缓冲区来平衡两端的速率。
对于键盘:可以让用户在将输入传输给程序之前返回并更正。

getline的两种用法:
用法1: cin.getline(字符数组(或字符指针), 字符个数n, 终止标志字符)

istream& get(char*intchar);
istream& get(char*int,);
istream& getline(char*intchar);
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中。

猜你喜欢

转载自blog.csdn.net/qq_42567607/article/details/125264018