C++(2)—输入输出流的详解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、C++输入输出与Java比较
  • 二、流的详解
    • 1.输出流
    • 2.输入流
  • 总结

前言


提示:以下是本篇文章正文内容,下面案例可供参考

一、C++输入输出流与Java比较

C++和Java都是流行的编程语言,它们在输入输出(I/O)流的处理上有一些相似之处,但也存在显著的差异。以下是C++和Java在I/O流方面的一些比较:

  1. 库和API:

    • C++: 使用标准模板库(STL)中的I/O流,包括等头文件。
    • Java: 使用java.iojava.util包中的类,如FileInputStreamFileOutputStreamBufferedReaderPrintWriter等。
  2. 流的类型:

    • C++: 支持更广泛的流类型,包括文件流、字符串流、内存流等。
    • Java: 主要围绕字节流(InputStreamOutputStream)和字符流(ReaderWriter)构建,以及它们各自的缓冲版本。
  3. 异常处理:

    • C++: 通常使用异常处理(try-catch块)来处理I/O错误。
    • Java: 同样使用异常处理,但I/O操作可能会抛出更多的异常类型,如IOException
  4. 内存管理:

    • C++: 需要手动管理内存,这在处理大型文件或大量数据时可能会更复杂。
    • Java: 通过垃圾回收机制自动管理内存,简化了内存管理。
  5. 字符串处理:

    • C++: 字符串处理通常使用std::string类,它提供了丰富的字符串操作方法。
    • Java: 使用String类,同样提供了丰富的字符串操作方法,但Java的字符串是不可变的。
  6. 格式化输出:

    • C++: 可以使用iostream库中的操作符重载来实现格式化输出,或者使用C风格的printf函数。
    • Java: 使用String.format方法或Formatter类来实现格式化输出。
  7. 文件处理:

    • C++: 文件操作通常涉及文件指针和文件描述符,需要更多的底层控制。
    • Java: 文件处理更高级,通过对象和方法调用来完成,更易于理解和使用。
  8. 跨平台性:

    • C++: 需要考虑不同操作系统的文件路径和I/O特性。
    • Java: 设计为跨平台,通过Java虚拟机(JVM)抽象了底层操作系统的差异。
  9. 性能:

    • C++: 通常提供更好的性能,因为它更接近硬件,允许更多的优化。
    • Java: 性能可能稍逊,但JVM的即时编译(JIT)和优化可以显著提高性能。
  10. 易用性:

    • C++: 对于初学者来说可能更复杂,因为它提供了更多的控制和灵活性。
    • Java: 更加用户友好,特别是对于初学者,因为它提供了更高级的抽象。

总的来说,C++提供了更多的控制和灵活性,但这也意味着更复杂的编程模型。Java则提供了更高级的抽象,使得编程更简单,但可能会牺牲一些性能。选择哪种语言取决于项目需求、性能要求以及开发者的偏好。

二、流的详解

1.输出流

C++中的输出流是用于将数据从程序发送到外部目的地(如屏幕、文件等)的流。以下是C++中一些常用的输出流类型和它们的功能:

  1. 标准输出流 (std::cout):

    • std::cout 是最常用的输出流,用于将数据输出到标准输出设备,通常是屏幕。它与 std::ostream 类相关联,并声明在  头文件中。
  2. 文件输出流 (std::ofstream):

    • std::ofstream 用于将数据写入文件。它提供了对文件的打开、关闭和写入操作。使用 std::ofstream 时,需要指定文件名和模式(如 std::ios::out),这些模式可以通过位或操作符(|)组合使用,实现多种功能。
  3. 字符串输出流 (std::ostringstream):

    • std::ostringstream 用于将数据写入字符串。它允许你以流的方式向字符串中插入数据,这在格式化输出时非常有用。
  4. 标准错误流 (std::cerr):

    • std::cerr 是一个全局输出流对象,用于向标准错误输出设备发送错误信息。它与 std::ostream 类相关联,并且是无缓冲的,这意味着错误信息会立即输出。
  5. 标准日志流 (std::clog):

    • std::clog 与 std::cerr 类似,但它是带缓冲的。它用于输出日志信息,这些信息通常会被写入到错误日志文件中。
  6. 流操作符 (<<):

    • 在C++中,<< 操作符用于将数据发送到输出流。它可以连续使用,以实现多个数据的链式输出。
  7. 操纵符:

    • C++提供了多种操纵符,如 std::endl(刷新缓冲区并换行)、std::flush(刷新缓冲区)等,用于控制输出流的行为。
  8. 格式化输出:

    • C++的输出流支持格式化输出,可以通过流操作符和操纵符来实现,如 std::setw(设置宽度)、std::setprecision(设置精度)等。
  9. 缓冲:

    • C++的输出流可以是缓冲的或无缓冲的。缓冲的流(如 std::cout)会在缓冲区满或遇到特定条件时刷新缓冲区,而无缓冲的流(如 std::cerr)则会立即输出数据。
  10. 错误处理:

    • C++的输出流提供了错误状态,可以通过 std::ios::failbitstd::ios::badbit 等状态标志来检查流的错误状态。

C++的输出流提供了灵活且强大的数据输出能力,使得开发者可以轻松地控制数据的输出格式和目的地。通过使用不同的流类型和操作符,可以实现各种复杂的输出需求。

2.输入流

C++中的输入流用于从外部源(如键盘、文件、网络等)读取数据。以下是C++中一些常用的输入流类型和它们的功能:

  1. 标准输入流 (std::cin):

    • std::cin 是最常用的输入流,用于从标准输入设备(通常是键盘)读取数据。它与 std::istream 类相关联,并声明在  头文件中。
  2. 文件输入流 (std::ifstream):

    • std::ifstream 用于从文件中读取数据。它提供了对文件的打开、关闭和读取操作。使用 std::ifstream 时,需要指定文件名和模式(如 std::ios::in),这些模式可以通过位或操作符(|)组合使用,实现多种功能。
  3. 字符串输入流 (std::istringstream):

    • std::istringstream 用于从字符串中读取数据。它允许你以流的方式从字符串中提取数据,这在解析字符串时非常有用。
  4. 格式化输入:

    • C++的输入流支持格式化输入,可以通过流操作符和操纵符来实现,如 std::setw(设置宽度)等。
  5. 提取操作符 (>>):

    • 在C++中,>> 操作符用于从输入流中提取数据。它可以连续使用,以实现多个数据的链式输入。
  6. 操纵符:

    • C++提供了多种操纵符,如 std::ws(忽略空白字符)等,用于控制输入流的行为。
  7. 缓冲:

    • C++的输入流可以是缓冲的或无缓冲的。缓冲的流(如 std::cin)会在缓冲区满或遇到特定条件时从输入源读取数据,而无缓冲的流则会立即读取数据。
  8. 错误处理:

    • C++的输入流提供了错误状态,可以通过 std::ios::failbitstd::ios::badbit 等状态标志来检查流的错误状态。如果输入数据的类型与预期不匹配,或者读取过程中发生错误,这些标志会被设置。
  9. 忽略和吞并输入:

    • std::ignore 可以用于忽略输入流中的字符,直到遇到指定的分隔符或读取了指定数量的字符。
    • std::getline 可以用于从输入流中读取一行数据,直到遇到换行符。
  10. 输入限制:

    • 可以使用 std::cin.setf(std::ios::fixed, std::ios::floatfield) 设置输入流以固定小数点格式读取浮点数。
  11. 输入掩码:

    • 可以使用 std::setlocale 设置区域,从而影响输入流如何处理特定区域的字符和数字格式。
  12. 同步输入输出:

    • std::cin.tie(&std::cout) 可以用于同步输入和输出流,使得输入操作等待输出操作完成后才继续。

C++的输入流提供了灵活且强大的数据读取能力,使得开发者可以轻松地控制数据的读取格式和来源。通过使用不同的流类型和操作符,可以实现各种复杂的输入需求。


总结与代码

#define _CRT_SECURE_NO_WARNINGS 1
#include 
using namespace std;
int main()
{
int a = 0;
double b = 0.1;
char c = 'x';
cout << a << " " << b << " " << c << endl;
std::cout << a << " " << b << " " << c << std::endl;
scanf("%d%lf", &a, &b);
printf("%d %lf\n", a, b);
// 可以⾃动识别变量的类型
cin >> a;
cin >> b >> c;
cout << a << endl;
cout << b << " " << c << endl;
return 0;
}

#include
using namespace std;
int main()
{
// 在io需求⽐较⾼的地⽅,如部分⼤量输⼊的竞赛题中,加上以下3⾏代码
// 可以提⾼C++IO效率
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
return 0;
}

是 Input Output Stream 的缩写,是标准的输⼊、输出流库,定义了标准的输⼊、输
出对象。
• std::cin 是 istream 类的对象,它主要⾯向窄字符(narrow characters (of type char))的标准输
⼊流。
• std::cout 是 ostream 类的对象,它主要⾯向窄字符的标准输出流。
• std::endl 是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区。
• <<是流插⼊运算符,>>是流提取运算符。(C语⾔还⽤这两个运算符做位运算左移/右移)
• 使⽤C++输⼊输出更⽅便,不需要像printf/scanf输⼊输出时那样,需要⼿动指定格式,C++的输⼊
输出可以⾃动识别变量类型(本质是通过函数重载实现的,这个以后会讲到),其实最重要的是
C++的流能更好的⽀持⾃定义类型对象的输⼊输出。
• IO流涉及类和对象,运算符重载、继承等很多⾯向对象的知识,这些知识我们还没有讲解,所以这
⾥我们只能简单认识⼀下C++ IO流的⽤法,后⾯我们会有专⻔的⼀个章节来细节IO流库。
• cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要
通过命名空间的使⽤⽅式去⽤他们。
• ⼀般⽇常练习中我们可以using namespace std,实际项⽬开发中不建议using namespace std。
• 这⾥我们没有包含,也可以使⽤printf和scanf,在包含间接包含了。vs系列
编译器是这样的,其他编译器可能会报错。

你可能感兴趣的:(C++,c++,数据结构,算法,c语言,java)