C++--输入输出流

1. 输入输出

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

C++输入输出包括:

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

2. 输入输出流

2.1 流

  • 输入和输出时数据传送的过程称为流。
  • 流表示了//敲回车键的有: 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("%dn", 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; } 

版权声明:玥玥 发表于 2021-04-22 11:43:37。
转载请注明:C++--输入输出流 | 女黑客导航