青少年编程与数学 02-010 C++程序设计基础 12课题、输入输出

ops/2025/2/27 13:08:09/

青少年编程与数学 02-010 C++程序设计基础 12课题、输入输出

  • 一、输入输出
      • 1. 控制台输入输出
        • 1.1 标准输入(`std::cin`)
          • 读取单个字符
          • 读取字符串
          • 读取数值
          • 读取多行字符串
        • 1.2 标准输出(`std::cout`)
          • 输出单个字符
          • 输出字符串
          • 输出数值
          • 格式化输出
      • 2. 文件输入输出
        • 2.1 文件输入(`std::ifstream`)
          • 打开文件并读取内容
        • 2.2 文件输出(`std::ofstream`)
          • 打开文件并写入内容
        • 2.3 文件输入输出(`std::fstream`)
          • 打开文件进行读写
      • 3. 格式化输入输出
        • 3.1 输入格式化
          • 忽略输入流中的字符
          • 读取特定格式的数据
        • 3.2 输出格式化
          • 设置输出宽度和精度
          • 设置输出格式
      • 4. 错误处理
          • 检查输入流状态
          • 检查文件流状态
      • 总结
  • 二、C++中的流(Stream)
      • 1. 流的概念
      • 2. 标准输入输出流
      • 3. 流类
      • 4. 常见的流类
      • 5. 流的操作
      • 6. 格式化
      • 7. 示例
        • 7.1 标准输入输出
        • 7.2 文件输入输出
      • 8. 总结
  • 三、格式化输入
      • 1. 使用提取运算符(`>>`)
        • 示例
      • 2. 读取一行输入(`std::getline`)
        • 示例
      • 3. 忽略输入流中的字符(`std::istream::ignore`)
        • 示例
      • 4. 检查输入流状态
        • 示例
      • 5. 使用输入流的格式化标志
        • 示例
      • 总结
  • 四、格式化输出
      • 1. 操纵符(Manipulators)
        • 1.1 设置输出宽度(`std::setw`)
        • 1.2 设置输出精度(`std::setprecision`)
        • 1.3 设置数值格式
        • 1.4 设置对齐方式
        • 1.5 设置填充字符(`std::setfill`)
      • 2. 格式化标志
        • 2.1 设置和清除格式化标志
      • 3. 刷新输出流(`std::flush`)
      • 4. 示例
      • 总结

课题摘要:本文主要介绍了C++中的输入输出操作。文章详细讲解了控制台输入输出、文件输入输出以及格式化输入输出的方法和技巧。控制台输入输出通过std::cinstd::cout实现,文件输入输出则使用std::ifstreamstd::ofstreamstd::fstream。格式化输入输出涉及使用操纵符和格式化标志来控制数据的读取和显示格式。此外,文章还介绍了C++中的流概念,包括标准输入输出流和文件流,并提供了丰富的示例代码,帮助读者理解和掌握C++输入输出的各个方面。


一、输入输出

在C++语言中,输入输出(I/O)操作主要通过标准库中的流对象来实现。C++标准库提供了丰富的输入输出功能,包括控制台输入输出、文件输入输出等。以下是一些常见的输入输出操作及其示例:

1. 控制台输入输出

1.1 标准输入(std::cin

std::cin 是标准输入流对象,通常用于从控制台读取数据。它支持多种输入操作,包括输入单个字符、字符串和数值。

读取单个字符
char ch;
std::cin >> ch;  // 读取一个字符
读取字符串
std::string str;
std::cin >> str;  // 读取一个字符串,遇到空格或换行符停止
读取数值
int num;
std::cin >> num;  // 读取一个整数
读取多行字符串
std::string line;
while (std::getline(std::cin, line)) {std::cout << line << std::endl;
}
1.2 标准输出(std::cout

std::cout 是标准输出流对象,通常用于向控制台输出数据。它支持多种输出操作,包括输出单个字符、字符串和数值。

输出单个字符
char ch = 'A';
std::cout << ch;  // 输出一个字符
输出字符串
std::string str = "Hello, World!";
std::cout << str;  // 输出一个字符串
输出数值
int num = 10;
std::cout << num;  // 输出一个整数
格式化输出
#include <iomanip>  // 包含格式化输出的头文件int num = 10;
double pi = 3.14159265358979323846;std::cout << std::setw(10) << std::setprecision(5) << std::fixed << pi << std::endl;  // 输出格式化后的浮点数
std::cout << std::hex << num;  // 以十六进制形式输出整数

2. 文件输入输出

2.1 文件输入(std::ifstream

std::ifstream 是用于文件输入的流类。它可以从文件中读取数据。

打开文件并读取内容
#include <fstream>
#include <string>std::ifstream file("input.txt");
if (file.is_open()) {std::string line;while (std::getline(file, line)) {std::cout << line << std::endl;}file.close();
} else {std::cerr << "Unable to open file" << std::endl;
}
2.2 文件输出(std::ofstream

std::ofstream 是用于文件输出的流类。它可以向文件中写入数据。

打开文件并写入内容
#include <fstream>
#include <string>std::ofstream file("output.txt");
if (file.is_open()) {file << "Hello, World!" << std::endl;file.close();
} else {std::cerr << "Unable to open file" << std::endl;
}
2.3 文件输入输出(std::fstream

std::fstream 是用于同时进行文件输入和输出的流类。它可以同时打开文件进行读写操作。

打开文件进行读写
#include <fstream>
#include <string>std::fstream file("data.txt", std::ios::in | std::ios::out | std::ios::app);
if (file.is_open()) {file << "This is a new line." << std::endl;  // 写入内容file.seekg(0, std::ios::beg);  // 将读取指针移动到文件开头std::string line;while (std::getline(file, line)) {std::cout << line << std::endl;}file.close();
} else {std::cerr << "Unable to open file" << std::endl;
}

3. 格式化输入输出

3.1 输入格式化

std::cin 支持多种格式化输入,可以通过设置输入流的状态来控制输入行为。

忽略输入流中的字符
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');  // 忽略输入流中的所有字符,直到遇到换行符
读取特定格式的数据
int num;
char ch;
std::cin >> num >> ch;  // 读取一个整数和一个字符
3.2 输出格式化

std::cout 支持多种格式化输出,可以通过设置输出流的状态来控制输出格式。

设置输出宽度和精度
#include <iomanip>double pi = 3.14159265358979323846;
std::cout << std::setw(10) << std::setprecision(5) << std::fixed << pi << std::endl;  // 输出格式化后的浮点数
设置输出格式
int num = 10;
std::cout << std::hex << num;  // 以十六进制形式输出整数
std::cout << std::oct << num;  // 以八进制形式输出整数
std::cout << std::dec << num;  // 以十进制形式输出整数

4. 错误处理

在进行输入输出操作时,可能会遇到各种错误,如文件打开失败、读写错误等。可以通过检查流的状态来处理这些错误。

检查输入流状态
if (std::cin.fail()) {std::cerr << "Input error" << std::endl;std::cin.clear();  // 清除错误状态std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');  // 忽略输入流中的错误输入
}
检查文件流状态
std::ifstream file("input.txt");
if (!file.is_open()) {std::cerr << "Unable to open file" << std::endl;
}

总结

C++语言的输入输出操作主要通过标准库中的流对象来实现,包括控制台输入输出和文件输入输出。掌握这些输入输出操作的方法和技巧,可以让你更高效地处理数据输入和输出,提高程序的可读性和可维护性。

二、C++中的流(Stream)

在C++中,流(Stream)是一个抽象的概念,用于表示数据的序列化和反序列化过程。流提供了一种统一的接口,用于处理输入输出操作,使得数据的读写变得灵活和方便。C++标准库中的流类主要分为输入流(Input Stream)和输出流(Output Stream),分别用于处理输入和输出操作。

1. 流的概念

流可以看作是一个数据的管道,数据可以通过这个管道从一个地方流向另一个地方。在C++中,流对象封装了输入输出操作的细节,提供了方便的方法来读取和写入数据。

2. 标准输入输出流

C++标准库提供了几个预定义的流对象,用于处理标准输入和标准输出:

  • std::cin:标准输入流,通常与键盘输入关联。
  • std::cout:标准输出流,通常与屏幕输出关联。
  • std::cerr:标准错误输出流,通常与屏幕输出关联,用于输出错误信息。
  • std::clog:标准日志输出流,通常与屏幕输出关联,用于输出日志信息。

3. 流类

C++标准库中的流类主要继承自两个基类:std::istreamstd::ostream。这两个基类分别提供了输入和输出操作的接口。

  • std::istream:输入流基类,提供了输入操作的方法。
  • std::ostream:输出流基类,提供了输出操作的方法。

4. 常见的流类

  • std::cin:类型为 std::istream,用于从标准输入读取数据。
  • std::cout:类型为 std::ostream,用于向标准输出写入数据。
  • std::cerr:类型为 std::ostream,用于向标准错误输出写入数据。
  • std::clog:类型为 std::ostream,用于向标准日志输出写入数据。
  • std::ifstream:文件输入流类,用于从文件读取数据。
  • std::ofstream:文件输出流类,用于向文件写入数据。
  • std::fstream:文件输入输出流类,用于同时进行文件的读写操作。

5. 流的操作

流对象提供了多种方法来读取和写入数据,这些方法包括:

  • 提取运算符(>>:用于从输入流读取数据。
  • 插入运算符(<<:用于向输出流写入数据。
  • std::getline:用于从输入流读取一行数据。
  • std::istream::ignore:用于忽略输入流中的数据。
  • std::istream::peek:用于查看输入流中的下一个字符,但不提取它。
  • std::istream::get:用于读取一个字符。
  • std::istream::putback:用于将一个字符放回输入流。
  • std::ostream::flush:用于刷新输出流,确保所有缓冲区中的数据都被写入目标设备。

6. 格式化

C++标准库还提供了一些格式化操作符,用于控制输入输出的格式。这些操作符主要定义在 <iomanip> 头文件中,包括:

  • std::setw:设置输出字段的宽度。
  • std::setprecision:设置浮点数的精度。
  • std::fixed:设置浮点数的固定小数点表示法。
  • std::scientific:设置浮点数的科学计数法表示。
  • std::hex:设置整数的十六进制表示。
  • std::oct:设置整数的八进制表示。
  • std::dec:设置整数的十进制表示。
  • std::left:设置左对齐输出。
  • std::right:设置右对齐输出。
  • std::internal:设置内部对齐输出。
  • std::boolalpha:设置布尔值的文本表示。
  • std::noboolalpha:设置布尔值的数值表示。

7. 示例

以下是一些使用标准输入输出流的示例:

7.1 标准输入输出
#include <iostream>
#include <iomanip>int main() {int num;std::cout << "Enter a number: ";std::cin >> num;std::cout << "You entered: " << num << std::endl;double pi = 3.14159265358979323846;std::cout << "Pi: " << std::fixed << std::setprecision(5) << pi << std::endl;return 0;
}
7.2 文件输入输出
#include <fstream>
#include <iostream>
#include <string>int main() {// 文件输出std::ofstream outFile("output.txt");if (outFile.is_open()) {outFile << "Hello, World!" << std::endl;outFile.close();} else {std::cerr << "Unable to open output file" << std::endl;}// 文件输入std::ifstream inFile("output.txt");if (inFile.is_open()) {std::string line;while (std::getline(inFile, line)) {std::cout << line << std::endl;}inFile.close();} else {std::cerr << "Unable to open input file" << std::endl;}return 0;
}

8. 总结

C++中的流是一个强大的概念,用于处理输入输出操作。标准输入输出流(std::cinstd::coutstd::cerrstd::clog)提供了方便的方法来读取和写入数据,而文件流(std::ifstreamstd::ofstreamstd::fstream)则用于处理文件操作。掌握这些流的使用方法和格式化操作符,可以让你更高效地处理数据的输入输出,提高程序的可读性和可维护性。

三、格式化输入

在C++中,格式化输入通常涉及控制输入数据的读取方式,以确保输入数据符合预期的格式。虽然C++标准库没有像格式化输出那样提供丰富的格式化输入功能,但仍然有一些方法可以实现输入的格式化。以下是一些常见的格式化输入技术:

1. 使用提取运算符(>>

提取运算符 >> 是最基本的输入格式化方法,用于从输入流中读取数据。它可以根据数据类型自动跳过前导空白字符(如空格、制表符、换行符)。

示例
#include <iostream>
#include <string>int main() {int num;double pi;std::string name;std::cout << "Enter an integer: ";std::cin >> num;std::cout << "Enter a double: ";std::cin >> pi;std::cout << "Enter your name: ";std::cin >> name;std::cout << "You entered: " << num << std::endl;std::cout << "You entered: " << pi << std::endl;std::cout << "You entered: " << name << std::endl;return 0;
}

2. 读取一行输入(std::getline

std::getline 函数用于从输入流中读取一行数据,直到遇到换行符。它不会跳过前导空白字符,因此可以读取包含空格的字符串。

示例
#include <iostream>
#include <string>int main() {std::string line;std::cout << "Enter a line of text: ";std::getline(std::cin, line);std::cout << "You entered: " << line << std::endl;return 0;
}

3. 忽略输入流中的字符(std::istream::ignore

std::istream::ignore 方法用于忽略输入流中的指定数量的字符,通常用于清除输入流中的多余字符,如换行符。

示例
#include <iostream>
#include <limits>int main() {int num;std::string name;std::cout << "Enter an integer: ";std::cin >> num;// 忽略输入流中的剩余字符,直到换行符std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');std::cout << "Enter your name: ";std::getline(std::cin, name);std::cout << "You entered: " << num << std::endl;std::cout << "You entered: " << name << std::endl;return 0;
}

4. 检查输入流状态

在读取输入时,可以检查输入流的状态,以确保输入数据有效。如果输入流进入错误状态,可以使用 std::cin.clear() 清除错误状态,并使用 std::cin.ignore 忽略错误输入。

示例
#include <iostream>
#include <limits>int main() {int num;std::cout << "Enter an integer: ";while (!(std::cin >> num)) {std::cout << "Invalid input. Please enter an integer: ";std::cin.clear();  // 清除错误状态std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');  // 忽略错误输入}std::cout << "You entered: " << num << std::endl;return 0;
}

5. 使用输入流的格式化标志

虽然C++标准库没有提供像输出流那样的格式化标志,但可以使用一些技巧来实现类似的输入格式化。例如,可以使用 std::istringstreamstd::ostringstream 来处理字符串输入和输出。

示例
#include <iostream>
#include <sstream>
#include <string>int main() {std::string input;int num1, num2;std::cout << "Enter two integers separated by a space: ";std::getline(std::cin, input);std::istringstream iss(input);if (iss >> num1 >> num2) {std::cout << "You entered: " << num1 << " and " << num2 << std::endl;} else {std::cout << "Invalid input." << std::endl;}return 0;
}

总结

C++中的格式化输入主要通过提取运算符 >>std::getlinestd::istream::ignore 和输入流状态检查来实现。这些方法可以帮助你确保输入数据的格式正确,并处理各种输入错误。虽然C++的输入格式化功能不如输出格式化功能丰富,但通过合理使用这些方法,可以有效地处理输入数据。

四、格式化输出

在C++中,格式化输出是指在输出数据时控制其格式,以使其更易于阅读和理解。C++标准库提供了丰富的格式化输出功能,主要通过操纵符(Manipulators)和格式化标志来实现。这些功能可以帮助你控制输出的宽度、精度、对齐方式、数值格式等。以下是一些常见的格式化输出方法和示例:

1. 操纵符(Manipulators)

操纵符是用于修改输出流状态的函数或对象,它们可以插入到输出流中,以改变后续输出的格式。

1.1 设置输出宽度(std::setw

std::setw 用于设置输出字段的宽度。

#include <iostream>
#include <iomanip>int main() {int num = 123;double pi = 3.14159265358979323846;std::cout << std::setw(10) << num << std::endl;  // 输出宽度为10std::cout << std::setw(10) << pi << std::endl;   // 输出宽度为10return 0;
}
1.2 设置输出精度(std::setprecision

std::setprecision 用于设置浮点数的精度。

#include <iostream>
#include <iomanip>int main() {double pi = 3.14159265358979323846;std::cout << std::setprecision(5) << pi << std::endl;  // 精度为5位小数std::cout << std::setprecision(10) << pi << std::endl; // 精度为10位小数return 0;
}
1.3 设置数值格式
  • std::fixed:固定小数点表示法。
  • std::scientific:科学计数法表示。
  • std::hex:十六进制表示。
  • std::oct:八进制表示。
  • std::dec:十进制表示。
#include <iostream>
#include <iomanip>int main() {double pi = 3.14159265358979323846;int num = 255;std::cout << std::fixed << pi << std::endl;       // 固定小数点表示std::cout << std::scientific << pi << std::endl;  // 科学计数法表示std::cout << std::dec << num << std::endl;        // 十进制表示std::cout << std::hex << num << std::endl;        // 十六进制表示std::cout << std::oct << num << std::endl;        // 八进制表示return 0;
}
1.4 设置对齐方式
  • std::left:左对齐。
  • std::right:右对齐。
  • std::internal:内部对齐(仅对数值类型有效)。
#include <iostream>
#include <iomanip>int main() {int num = 123;double pi = 3.14159265358979323846;std::cout << std::setw(10) << std::left << num << std::endl;  // 左对齐std::cout << std::setw(10) << std::right << pi << std::endl;  // 右对齐std::cout << std::setw(10) << std::internal << num << std::endl;  // 内部对齐return 0;
}
1.5 设置填充字符(std::setfill

std::setfill 用于设置填充字符。

#include <iostream>
#include <iomanip>int main() {int num = 123;std::cout << std::setw(10) << std::setfill('*') << num << std::endl;  // 填充字符为'*'return 0;
}

2. 格式化标志

格式化标志是输出流的状态标志,可以通过位运算符来设置和清除。这些标志定义在 <iomanip> 头文件中。

2.1 设置和清除格式化标志
  • std::ios::fixed:固定小数点表示法。
  • std::ios::scientific:科学计数法表示。
  • std::ios::hex:十六进制表示。
  • std::ios::oct:八进制表示。
  • std::ios::dec:十进制表示。
  • std::ios::left:左对齐。
  • std::ios::right:右对齐。
  • std::ios::internal:内部对齐。
  • std::ios::boolalpha:布尔值的文本表示。
  • std::ios::noboolalpha:布尔值的数值表示。
#include <iostream>
#include <iomanip>int main() {double pi = 3.14159265358979323846;bool flag = true;std::cout.setf(std::ios::fixed);  // 固定小数点表示std::cout << pi << std::endl;std::cout.setf(std::ios::scientific, std::ios::floatfield);  // 科学计数法表示std::cout << pi << std::endl;std::cout.setf(std::ios::hex, std::ios::basefield);  // 十六进制表示std::cout << 255 << std::endl;std::cout.setf(std::ios::left);  // 左对齐std::cout << std::setw(10) << 123 << std::endl;std::cout.setf(std::ios::boolalpha);  // 布尔值的文本表示std::cout << flag << std::endl;std::cout.setf(std::ios::noboolalpha);  // 布尔值的数值表示std::cout << flag << std::endl;return 0;
}

3. 刷新输出流(std::flush

std::flush 用于刷新输出流,确保所有缓冲区中的数据都被写入目标设备。

#include <iostream>
#include <iomanip>int main() {std::cout << "Hello, World!" << std::flush;  // 刷新输出流return 0;
}

4. 示例

以下是一个综合示例,展示了多种格式化输出方法:

#include <iostream>
#include <iomanip>
#include <string>int main() {int num = 123;double pi = 3.14159265358979323846;bool flag = true;std::string name = "Alice";// 设置输出宽度和精度std::cout << std::setw(10) << std::setprecision(5) << std::fixed << pi << std::endl;// 设置对齐方式和填充字符std::cout << std::setw(10) << std::left << std::setfill('_') << num << std::endl;// 设置数值格式std::cout << std::hex << num << std::endl;  // 十六进制表示std::cout << std::oct << num << std::endl;  // 八进制表示std::cout << std::dec << num << std::endl;  // 十进制表示// 设置布尔值的文本表示std::cout.setf(std::ios::boolalpha);std::cout << flag << std::endl;// 输出字符串std::cout << std::setw(10) << std::left << name << std::endl;return 0;
}

总结

C++中的格式化输出功能非常强大,通过操纵符和格式化标志,可以灵活地控制输出数据的格式。掌握这些方法可以帮助你生成更美观、更易读的输出,提高程序的可读性和可维护性。


http://www.ppmy.cn/ops/161680.html

相关文章

http 协议和 https 协议的区别在哪里?【详情解答】

HTTP&#xff08;超文本传输协议&#xff09;和HTTPS&#xff08;超文本传输安全协议&#xff09;都是用于在网络上传输数据的协议&#xff0c;二者存在多方面的区别&#xff0c;具体如下&#xff1a; 安全性&#xff1a;这是HTTP和HTTPS最主要的区别。HTTP协议是明文传输数据…

从头再来!社招找工作——算法题复习十:双指针/前缀和/滑动窗口

从头再来&#xff01;社招找工作——算法题复习十&#xff1a;双指针/前缀和/滑动窗口 双指针/前缀和/滑动窗口双指针判断是否为回文字符串&#xff08;Easy&#xff09;盛水最多的容器&#xff08;Middle&#xff09; 前缀和数组的平均数值&#xff08;Easy&#xff09;除自身…

Origin 2024绘图与数据分析下载|附安装包+学习教程

如大家所了解的&#xff0c;Origin是一款图形可视化和数据分析软件&#xff0c;它是为初学者提供了使用的界面&#xff0c;并且随着用户对应用程序的日益熟还可以执行高等自定义。软件具有大量2D和3D绘图模板。 Origin主要应用&#xff1a; 绘图 凭借100多种内置和扩展的图表…

[AI概念域] AI 大模型是如何被训练出来的?(通俗解读)

说明&#xff1a;这里使用 学生成长五部曲 比喻带你理解大模型如何从零开始学会思考。 AI大模型的训练过程可分为四个核心阶段&#xff1a; 首先进行海量数据收集与清洗&#xff0c;如同为“学生”准备涵盖各领域知识的教材库&#xff1b;接着通过预训练让模型完成“填空题”…

DeepSeek教unity------UI框架

/****************************************************文件&#xff1a;BasePanel.cs作者&#xff1a;Edision日期&#xff1a;#CreateTime#功能&#xff1a;面板基类 *****************************************************/using UnityEngine;public class BasePanel : Mo…

AI DEV 人工智能能做的工作,在开发运维安全方面以及企业成本降低方面所起的作用和相应的提示词。

这个查询是用中文提出的&#xff0c;询问人工智能在开发、运维、安全方面以及企业成本降低方面的作用和相应的提示词。我应该用中文回答&#xff0c;并涵盖以下几个方面&#xff1a; AI在软件开发中的应用AI在IT运维中的应用AI在网络安全中的应用AI如何帮助企业降低成本针对这…

DeepSeek 提示词:基础结构

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

Mysql基础-多表查询(详细版)

目录 一、表的关系类型与适用场景二、连接方式与使用场景三、易错点与注意事项四、总结 一、表的关系类型与适用场景 1. 一对一关系 场景&#xff1a;一个表的记录对应另一个表的唯一记录 案例&#xff1a;用户表 用户详情表 CREATE TABLE users (id INT PRIMARY KEY,name…