您的位置:

C++iostream详解

一、iostream简介

iostream是C++标准库中的重要组成部分,用于在C++程序中进行输入输出操作。其中,i代表输入,o代表输出,而stream代表了数据流。它是面向对象的,内置了一些底层操作,使得我们可以更方便地进行文件和控制台的输入输出操作。

二、iostream的基础操作

iostream底层使用了缓存机制,所以我们需要使用flush来将缓存中的数据输出到终端中,同时为了保证终端窗口中数据的双向通信,需要在每次输出完毕后使用endl来结束一行语句并刷新缓存。

#include <iostream>
using namespace std;
int main()
{
  int num = 125;
  cout << "num的值为:" << num << endl;
  cout << "输入一个整数:";
  int in_num;
  cin >> in_num;
  cout << "输入的整数是:" << in_num << endl;
  return 0;
} 

三、iostream的高级操作

iostream还支持对文件操作的输入输出。我们可以利用fstream头文件中的ifstream和ofstream来分别实现文件的读取和输出。在打开文件时,需要使用open()函数将文件名和打开方式一起传入。读取文件时,使用getline()函数可以逐行读取文件中的内容。

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
  ofstream outfile;
  outfile.open("test.txt", ios::out);
  outfile << "hello world!" << endl;
  outfile.close();
  ifstream infile;
  infile.open("test.txt", ios::in);
  string s;
  if(infile.is_open()){
    while(getline(infile, s)){
      cout << s << endl;
    }
  }
  infile.close();
  return 0;
}

四、iostream的格式化操作

iostream支持多种格式化操作,如setw()函数可以设置输出数据字段的宽度,setprecision()函数可以设置输出小数的精度等。

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
  double pi = 3.1415926535;
  cout << "不设置精度:" << pi << endl;
  cout << "设置精度为3:" << setprecision(3) << pi << endl;
  cout << "字段宽度为10:" << setw(10) << pi << endl;
  return 0;
}

五、iostream的异常处理

iostream能够捕获并处理输入输出的异常。例如,如果我们想要输入一个整数,但用户输入了一个非法字符,则会抛出异常并终止程序。我们可以使用try-catch语句来处理异常,并将程序的控制权交还给用户。

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
  try{
    int num;
    cout << "请输入一个整数:";
    cin.exceptions(ios_base::failbit);
    cin >> num;
    cout << "输入的整数是:" << num << endl;
  } catch(ios_base::failure &ex){
    cout << "输入的不是整数!" << endl;
  }
  return 0;
}

六、iostream的运算符重载

我们可以在自己的类中重载iostream的输入输出运算符,实现对象在控制台中的输入输出。例如,我们可以在一个名为Score的类中重载运算符<<和>>,以实现该类在控制台中的输入输出。

#include <iostream>
using namespace std;
class Score{
  public:
    Score(){}
    Score(int a, int b){
      math = a;
      english = b;
    }
    friend ostream& operator<<(ostream& os, Score& sc)
    {
        os << "Math: " << sc.math << " English: " << sc.english;
        return os;
    }
    friend istream& operator>>(istream& is, Score& sc)
    {
        cout<<"Input two number: "; 
        is >> sc.math >> sc.english; 
        return is;
    }
  private:
    int math;
    int english;
};
int main()
{
  Score x;
  cin >> x;
  cout << x << endl;
  return 0;
}

七、iostream的综合运用

下面是一份iostream的综合运用代码示例,包括了文件写入、读取、格式化输出等内容。程序将读取txt文件中的成绩单信息,并将每个学生的平均分输出到txt文件中。我们同时还可以看到如何使用点操作符、异常处理和重载运算符等高级特性。

#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
class Student{
  public:
    string name;
    int math, english;
    Student(){}
    Student(string n, int m, int e){
      name = n;
      math = m;
      english = e;
      average = (m + e) / 2;
    }
    double getAverage(){
        return average;
    }
    friend ostream& operator<<(ostream& os, Student& sc)
    {
        os << setw(10) << sc.name;
        os << setw(8) << sc.math;
        os << setw(8) << sc.english;
        os << setw(10) << setprecision(3) << sc.average << endl;
        return os;
    }
    friend istream& operator>>(istream& is, Student& sc)
    {
        is >> sc.name >> sc.math >> sc.english;
        if (is.fail()) {
            throw ios_base::failure("无效的输入!");
        }
        sc.average = (sc.math + sc.english) / 2.0;
        return is;
    }
  private:
    double average;
};
int main()
{
  ifstream infile;
  infile.open("grades.txt", ios::in);
  ofstream outfile;
  outfile.open("result.txt", ios::out | ios::trunc);
  outfile << "name\t math\t english\t avg" << endl;
  Student s;
  while(infile >> s){
    try{
      outfile << s;
    } catch (const ios_base::failure &ex){
      cerr << ex.what() << endl;
    }
  }
  outfile.close();
  infile.close();
  return 0;
}