C++ 第一阶段 基本语法 - 第三节:输入输出流

目录

一、C++ 输入输出流的核心概念

1.1 标准输入输出流对象

1.2 流操作符

二、cin/cout 与 scanf/printf 的对比

2.1 语法简洁性

2.2 类型安全性

2.3 性能差异

2.4 格式化输出

2.5 错误处理

三、cin/cout 的高级用法

3.1 读取整行输入

3.2 处理非法输入

3.3 文件流操作

四、cin/cout 与 scanf/printf 的性能对比实验

4.1 实验场景

五、选择建议

六、总结


一、C++ 输入输出流的核心概念

1.1 标准输入输出流对象

C++ 提供了以下预定义的流对象,用于标准输入输出:

  • std::cin:标准输入流(从键盘读取数据)。
  • std::cout:标准输出流(向屏幕写入数据)。
  • std::cerr:标准错误流(不带缓冲的错误输出)。
  • std::clog:标准日志流(带缓冲的错误输出)。

1.2 流操作符

  • 插入运算符 <<:用于向输出流中插入数据。
    std::cout << "Hello, World!" << std::endl;
  • 提取运算符 >>:用于从输入流中提取数据。
    int age;
    std::cin >> age;

二、cin/cout 与 scanf/printf 的对比

2.1 语法简洁性

  • C 风格 (scanf/printf)
    int a;
    scanf("%d", &a); // 需要指定格式符和取地址符
    printf("Value: %d\n", a);
  • C++ 风格 (cin/cout)
    int a;
    std::cin >> a; // 自动识别变量类型
    std::cout << "Value: " << a << std::endl;
    • 优点cin/cout 更简洁,无需手动管理格式符和地址。
    • 缺点cin/cout 在格式化输出时不如 printf 灵活。

2.2 类型安全性

  • scanf/printf
    • 风险:若格式符与变量类型不匹配,会导致未定义行为。
      int a;
      scanf("%d", &a); // 若输入非整数,程序可能崩溃。
  • cin/cout
    • 优势:通过操作符重载自动处理类型,避免格式符错误。
      int a;
      std::cin >> a; // 若输入非整数,流进入错误状态。

2.3 性能差异

  • scanf/printf
    • 优势:直接调用底层 C 库函数,性能较高。
    • 适用场景:大规模数据输入输出(如竞赛编程)。
  • cin/cout
    • 劣势:默认与 C 库同步(std::ios_base::sync_with_stdio(true)),性能较低。
    • 优化方式:关闭同步以提升性能。
      std::ios_base::sync_with_stdio(false); // 关闭同步
      std::cin.tie(nullptr); // 解绑 cin 和 cout

2.4 格式化输出

  • printf
    • 灵活性:支持丰富的格式化选项(如 %d%f%x)。
      printf("Integer: %d, Float: %.2f\n", 123, 45.67);
  • cout
    • 需要配合 iomanip:通过流操纵符实现格式化。
      #include 
      std::cout << std::fixed << std::setprecision(2) << 45.67 << std::endl;
      std::cout << std::setw(10) << "Hello" << std::endl; // 设置字段宽度

2.5 错误处理

  • scanf
    • 返回值检查:需手动检查返回值判断输入是否成功。
      if (scanf("%d", &a) != 1) {
          // 处理输入错误
      }
  • cin
    • 流状态检查:通过 cin.fail() 判断输入是否失败。
      if (!std::cin) {
          std::cin.clear(); // 清除错误状态
          std::cin.ignore(std::numeric_limits::max(), '\n'); // 忽略无效输入
      }

三、cin/cout 的高级用法

3.1 读取整行输入

  • std::getline
    std::string line;
    std::getline(std::cin, line); // 读取一行(包括空格)

3.2 处理非法输入

  • 示例:防止用户输入非数字时程序崩溃。
    int a;
    while (!(std::cin >> a)) {
        std::cin.clear(); // 清除错误标志
        std::cin.ignore(std::numeric_limits::max(), '\n'); // 跳过无效输入
        std::cout << "Invalid input. Please try again: ";
    }

3.3 文件流操作

  • ifstream 和 ofstream:用于文件读写。
    std::ofstream outFile("output.txt");
    outFile << "Writing to file..." << std::endl;
    outFile.close();
    
    std::ifstream inFile("input.txt");
    std::string line;
    while (std::getline(inFile, line)) {
        std::cout << line << std::endl;
    }
    inFile.close();

四、cin/cout 与 scanf/printf 的性能对比实验

4.1 实验场景

  • 目标:比较两者在大规模数据输入输出时的性能。
  • 代码示例
    // C++ 版本(关闭同步)
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    for (int i = 0; i < 1000000; ++i) {
        std::cout << i << ' ';
    }
    
    // C 版本
    for (int i = 0; i < 1000000; ++i) {
        printf("%d ", i);
    }
  • 结果
    • C 版本:通常比 C++ 版本快 2-5 倍。
    • C++ 版本:通过关闭同步后性能接近 C 版本。

五、选择建议

场景 推荐方法 理由
竞赛编程 scanf/printf 性能更高,适合大规模数据处理。
日常开发 cin/cout 类型安全、语法简洁,适合快速开发。
混合使用 慎用 避免 cin/cout 与 scanf/printf 混用导致同步问题。

六、总结

  • cin/cout 是 C++ 的推荐输入输出方式,具有类型安全、可扩展性强的优点。
  • scanf/printf 在性能上仍有优势,适合对效率要求极高的场景。
  • 实际开发中:根据需求选择合适的方法,或通过关闭同步优化 cin/cout 性能。

你可能感兴趣的:(C++从入门到入土连载,c++,开发语言)