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

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

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

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


一、输入输出

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

1. 控制台输入输出

1.1 标准输入(std::cin

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

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

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

输出单个字符
cpp 复制代码
char ch = 'A';
std::cout << ch;  // 输出一个字符
输出字符串
cpp 复制代码
std::string str = "Hello, World!";
std::cout << str;  // 输出一个字符串
输出数值
cpp 复制代码
int num = 10;
std::cout << num;  // 输出一个整数
格式化输出
cpp 复制代码
#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 是用于文件输入的流类。它可以从文件中读取数据。

打开文件并读取内容
cpp 复制代码
#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 是用于文件输出的流类。它可以向文件中写入数据。

打开文件并写入内容
cpp 复制代码
#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 是用于同时进行文件输入和输出的流类。它可以同时打开文件进行读写操作。

打开文件进行读写
cpp 复制代码
#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 支持多种格式化输入,可以通过设置输入流的状态来控制输入行为。

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

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

设置输出宽度和精度
cpp 复制代码
#include <iomanip>

double pi = 3.14159265358979323846;
std::cout << std::setw(10) << std::setprecision(5) << std::fixed << pi << std::endl;  // 输出格式化后的浮点数
设置输出格式
cpp 复制代码
int num = 10;
std::cout << std::hex << num;  // 以十六进制形式输出整数
std::cout << std::oct << num;  // 以八进制形式输出整数
std::cout << std::dec << num;  // 以十进制形式输出整数

4. 错误处理

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

检查输入流状态
cpp 复制代码
if (std::cin.fail()) {
    std::cerr << "Input error" << std::endl;
    std::cin.clear();  // 清除错误状态
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');  // 忽略输入流中的错误输入
}
检查文件流状态
cpp 复制代码
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 标准输入输出
cpp 复制代码
#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 文件输入输出
cpp 复制代码
#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. 使用提取运算符(>>

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

示例
cpp 复制代码
#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 函数用于从输入流中读取一行数据,直到遇到换行符。它不会跳过前导空白字符,因此可以读取包含空格的字符串。

示例
cpp 复制代码
#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 方法用于忽略输入流中的指定数量的字符,通常用于清除输入流中的多余字符,如换行符。

示例
cpp 复制代码
#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 忽略错误输入。

示例
cpp 复制代码
#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 来处理字符串输入和输出。

示例
cpp 复制代码
#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 用于设置输出字段的宽度。

cpp 复制代码
#include <iostream>
#include <iomanip>

int main() {
    int num = 123;
    double pi = 3.14159265358979323846;

    std::cout << std::setw(10) << num << std::endl;  // 输出宽度为10
    std::cout << std::setw(10) << pi << std::endl;   // 输出宽度为10

    return 0;
}
1.2 设置输出精度(std::setprecision

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

cpp 复制代码
#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:十进制表示。
cpp 复制代码
#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:内部对齐(仅对数值类型有效)。
cpp 复制代码
#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 用于设置填充字符。

cpp 复制代码
#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:布尔值的数值表示。
cpp 复制代码
#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 用于刷新输出流,确保所有缓冲区中的数据都被写入目标设备。

cpp 复制代码
#include <iostream>
#include <iomanip>

int main() {
    std::cout << "Hello, World!" << std::flush;  // 刷新输出流

    return 0;
}

4. 示例

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

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

相关推荐
小贾要学习11 分钟前
【C++】模板
c语言·开发语言·c++
阿巴~阿巴~24 分钟前
穷举vs暴搜vs深搜vs回溯vs剪枝(典型算法思想)—— OJ例题算法解析思路
开发语言·c++·算法·蓝桥杯·深度优先·剪枝·宽度优先
数据知道24 分钟前
数据存储:一文掌握存储数据到MongoDB详解
开发语言·数据库·python·mongodb
lly20240626 分钟前
Matplotlib 绘图标记
开发语言
玩c#的小杜同学40 分钟前
从“Switch-case“到“智能模式“:C#模式匹配的终极进化指南
开发语言·前端·c#·.net
二十雨辰1 小时前
[Java基础]反射技术
java·开发语言·算法
bossface1 小时前
ES的简单讲解
服务器·c++·json·gtest·etcd·spdlog
XuanRanDev1 小时前
【构建工具】Gradle Kotlin DSL中的大小写陷阱:BuildConfigField
android·开发语言·kotlin
学途路漫漫1 小时前
怎么修改node_modules里的文件,怎么使用patch-package修改node_modules的文件,怎么修改第三方库原文件。
开发语言·javascript·ecmascript
我命由我123451 小时前
34.Java 阻塞队列(阻塞队列架构、阻塞队列分类、阻塞队列核心方法)
java·服务器·开发语言·后端·架构·java-ee·后端开发