C++--输入输出流

输入输出流

  • 1. 输入输出
  • 2. 输入输出流
    • 2.1 流
    • 2.2 C++标准IO流
    • 2.3 C++文件IO流
  • 3. stringstream

1. 输入输出

  • 程序的输入:从输入文件将数据传送给程序;
  • 程序的输出:从程序将数据传送给输出文件;

C++输入输出包括:

  1. 对系统指定标准设备的输入输出,即从键盘输入数据,输出到显示器屏幕;
  2. 以外存(磁盘、光盘)为对象进行输入输出,例如:从磁盘文件输入数据,数据输出到磁盘文件;
  3. 对内存中指定的空间进行输入和输出。

2. 输入输出流

2.1 流

  • 输入和输出时数据传送的过程称为流。
  • 流表示了信息从源到目的端的流动;
  • 特性:有序连续,具有方向性;
  • 实际上,在内存中为每个数据流开辟一个内存缓冲区,用来存放流中的数据,即缓冲区中的数据就是流。
  • C++中,输入输出流被定义为类;I/O库中的类称为流类;用流类定义的对象称为流对象。
类名 作用 头文件声明
ios 抽象基类 iostream
istream 通用输入流和其他输入流的基类 iostream
ostream 通用输出流和其他输出流的基类 iostream
iostream 通用输入输出流和其他输入输出流的基类 iostream
ifstream 输入文件流类 fstream
ofstream 输出文件流类 fstream
fstream 输入输出文件流类 fstream
istrstream 输入字符串流类 strstream
ostrstream 输出字符串流类 strstream
strstream 输入输出字符串流类 strstream

2.2 C++标准IO流

对象 含义 对应设备 C语言中相应的标准文件 有无缓冲区
cin 标准输入流 键盘 stdin 有缓冲区
cout 标准输出流 屏幕 stdout 有缓冲区
cerr 标准错误流 屏幕 stderr 无缓冲区
clog 标准错误流 屏幕 stderr 有缓冲区
  1. cin为缓冲流,键盘输入的数据保存在缓冲区,当要提取时,从缓冲区提取;敲回车键完成输入;
//敲回车键的有:
cin >> a;
c = getchar();
scanf("%d", &a);
gets(str);
//不需敲回车键:getch、getche;
  1. 输入数据类型必须与要提取的数据类型一致;
  2. cin和cout可以直接输入和输出内置类型数据;
  3. 对于自定义类型,如果要支持cin和cout的标准输入输出,需要对<<和>>进行重载。
ostream operator<<(int);
void test()
{
     
	//cin:istream对象
	int a;
	cin >> a;
	//cin.operator>>(a);
	float f;
	cin >> f;
	//cin.operator>>(f);
	char arr[10];
	cin >> arr;

	//cout:ostream对象
	cout << a << endl;
	cout.operator<<(a).operator<<(endl);
	cout << f << endl;
	cout << arr << endl;
	//sacnf,printf:库函数

	//cerr、clog
	cerr << f << endl;
	clog << arr << endl;

}

2.3 C++文件IO流

  • C++文件内容的数据格式分为二进制文件个文本文件;

采用文件流对象操作文件的一般步骤为:

  1. 定义一个文件流对象;
  2. 使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和文件之间建立联系;
  3. 使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写;
  4. 关闭文件。
struct Student
{
     
	char name[10];
	int age;
};

void test()
{
     
	//ofstream:输出文件流
	//ifstream:输入文件流
	//写文件:文件不存在,创建文件
	ofstream fout("test.txt");
	//fout.open("test.txt");
	if (!fout.is_open())
		cout << "file not open" << endl;
	//写内容
	//1.文本形式:字符流读写
	fout << "test.txt" << endl;
	fout.put(' ');
	fout.put('a');
	fout.close();

	//读文件:文件不存在,打开失败
	ifstream fin("test.txt");
	char arr[100];
	//fin >> arr;
	char ch;
	ch = fin.get();
	fin.get(ch);
	//fin.get(arr, 100);
	fin.getline(arr, 10);

	ofstream fout1("test.txt");
	Student stu;
	stu.age = 30;
	strcpy(stu.name, "abc");
	fout1 << stu.name << endl;
	fout1 << stu.age << endl;
	fout1.close();
	//二进制读写 :字节流读写
	ofstream fout2("test.binary.txt");
	fout2.write((char*)&stu, sizeof(stu));
	fout2.close();

	ifstream fin1("test.binary.txt");
	Student stu1;
	/*fin >> stu.name;
	fin >> stu.age;*/
	fin.read((char*)&stu1, sizeof(stu1));
}

3. stringstream

  • C语言中,将整型变量的数据转化为字符串格式:(1)使用itoa()函数、使用sprintf()函数。
  • stringstream实际时在其底层维护了一个string类型的对象来保存结果;
  • 多次数据类型转化时,一定要用clear()来清空,才能正确转化,但clear()不会将stringstream底层的string对象清空;
  • 可以使用s. str("")方法将底层string对象设置为""空字符串;
  • 可以使用s.str()将让stringstream返回其底层的string对象;
  • stringstream使用string类对象代替字符数组,可以避免缓冲区溢出的危险,而且其会对参数类型进行推演,不需要格式化控制,也不会出现格式化失败的风险,因此使用更方便,更安全。
void test()
{
     
	
	int a = 10;
	int b = 010; //8
	int c = 0x10; //16
	char arr[100];
	itoa(a, arr, 10);
	itoa(b, arr, 8);
	itoa(c, arr, 16);
	sprintf(arr, "%d", a);
	float f = 2.3;
	sprintf(arr, "%f", f);
	printf("%d\n", a);

	stringstream ss;
	string str;
	ss << a;
	ss >> str;
	ss.clear();//下一次转换之前,调用clear接口清空状态位,不会清空stringstream对象中的内容
	ss << f;
	ss >> str;

	//str(重置内容):重置stringstream对象中的内容
	ss.str("");
	//str():获取stringstream对象中的内容
	str = ss.str();
	ss.clear();
	ss << f;
	str = ss.str();

	//字符串拼接
	ss.str("");
	ss << "123" << "345" << "789";
	cout << ss.str() << endl;
}

你可能感兴趣的:(C++,笔记,c++)