C++从入门到精通——C++输入和输出

C++输入和输出


前言

C++中的输入和输出主要通过标准库中的iostream类实现。使用cin对象从标准输入(如键盘)读取数据,使用cout对象将数据写入标准输出(如屏幕)。

可能大家总是会看到像这样的头文件#include<bits/stdc++.h>,其实这个头文件包含的是C++里大多数的头文件,在参加竞赛的时候就不需要花时间来写很多头文件了,直接写这一个就够了


一、C++打印Hello World

新生婴儿会以自己独特的方式向这个崭新的世界打招呼,C++刚出来后,也算是一个新事物,

那C++是否也应该向这个美好的世界来声问候呢?我们来看下C++是如何来实现问候的。

ps:在VC6.0中需要引用的头文件是#include<iostream.h>本文使用的是VS2022,以前一些老的编译器需要.h,新版编译器一般是不需要.h

c 复制代码
#include<iostream>
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
using namespace std;
int main()
{
	cout << "Hello world!!!" << endl;
	return 0;
}

二、C++输入&输出

在C++中想要调用函数除了引用头文件外还需要引用命名空间,关于命名空间可以看我C++从入门到精通------命名空间这篇文章,之所以需要这样,是为了防止冲突,本文的输入和输出函数都在命名空间std

关于I/O流

输入/输出流是计算机程序中用于读取和写入数据的一种方式。它允许程序从外部设备(如硬盘、键盘、网络等)读取数据,或将数据写入到外部设备中。

I/O流可以分为字节流和字符流两种类型。

字节流以字节(8位)为单位进行读写。它提供了一种通用的方式来处理任意类型的数据,包括文本、图片、音频等。常见的字节流类有InputStreamOutputStream

ps:根据InputStreamOutputStream,我们可以看到C++输入输出的头文件#include <iostream>取的就是输入和输出流的英文简写

字符流以字符(16位)为单位进行读写。它提供了更方便的方式来处理文本数据,支持字符的编码和解码。常见的字符流类有ReaderWriter

I/O流还可以根据读写的方式分为同步流和异步流。

同步流是指程序在读写数据时会阻塞,直到读写操作完成才继续执行后面的代码。它适用于数据量较小的情况,或者需要数据顺序读写的场景。

异步流是指程序在读写数据时不会阻塞,可以继续执行后面的代码。它适用于数据量较大、需要并发读写的情况,可以提高程序的性能。

在使用I/O流时,程序需要先创建流对象,然后通过流对象进行数据的读写操作。读取数据时,程序会从流中读取一定数量的字节或字符,并将其存储在内存中;写入数据时,程序会将内存中的字节或字符写入到流中,以传输到外部设备。

I/O流是计算机程序中常用的数据输入输出方式,它提供了灵活和高效的读写操作,使程序能够与外部设备进行有效的数据交互。

C++输入&输出

C++输入&输出是编程中不可或缺的两个环节,它们分别负责从外部获取数据和将程序处理结果展示给用户。在C++中,标准库提供了一组丰富的I/O函数和流对象,使得输入和输出操作变得简单而高效。(即#include <iostream>

从输入的角度来看,C++提供了多种方式来接收用户或其他数据源提供的信息。最常用的方式是使用cin对象,它是与标准输入流(通常是键盘)相关联的istream(标准输入流)对象。例如,我们可以使用cin >>运算符来读取整数、浮点数、字符串等各种类型的数据。此外,C++还提供了scanf函数,它提供了更多的格式化输入功能,允许我们按照指定的格式读取数据。(C++是兼容C语言的,所以C语言的语法C++也能用,主要根据自己的爱好)

输出方面,C++同样提供了多种方式来展示程序的处理结果。最常用的方式是使用cout对象,它是与标准输出流(通常是显示器)相关联的ostream(标准输出流)对象。通过cout <<运算符,我们可以将各种类型的数据输出到屏幕上。此外,C++还提供了printf函数,它提供了类似于scanf的格式化输出功能,允许我们按照指定的格式输出数据。

在实际编程中,输入和输出通常是紧密相关的。例如,在编写一个计算器程序时,我们需要从用户那里获取输入的数字和运算符,然后进行计算并将结果输出给用户。在这个过程中,输入和输出都是必不可少的环节。

为了提高程序的健壮性和用户友好性,我们还需要注意一些输入输出的细节问题。例如,在读取用户输入时,我们应该检查输入的有效性并给出相应的错误提示;在输出结果时,我们应该注意格式化和排版,使得输出结果清晰易读。

总之,C++输入&输出是编程中不可或缺的两个环节。通过合理使用C++提供的I/O函数和流对象,我们可以轻松地实现数据的输入和输出操作,为编写高效、健壮、用户友好的程序打下坚实的基础。

cout函数

cout函数是C++中的标准输出函数,用于将数据输出到控制台或其他输出设备。它位于iostream头文件中,使用前需要包含该头文件。cout函数的原型为:

cpp 复制代码
std::ostream& cout (std::ostream& os);//&在c++中可以是取地址,也可以是取别名,具体可看后续文章讲解

cout函数可以接受各种数据类型作为参数进行输出,并且可以通过运算符重载的方式实现对不同数据类型的输出。使用cout函数进行输出时,可以使用插入运算符(<<)来将数据插入到输出流中。

例如,输出一个整数可以使用以下语句:

cpp 复制代码
int num = 10;
cout << num;

输出一个字符串可以使用以下语句:

cpp 复制代码
std::string str = "Hello, world!";
cout << str;

cout函数可以与其他输出操作符一起使用,以便于输出多个数据。

cpp 复制代码
int num1 = 10;
int num2 = 20;
cout << "Numbers: " << num1 << " and " << num2;

上述代码输出结果为:"Numbers: 10 and 20"

ps:cout函数打印数据是自动识别类型的不需要我们像printf一样打印类型

cin函数

cin函数是C++语言中的标准输入流函数,用于从用户输入获取数据。它可以读取各种类型的数据,如整数、浮点数、字符、字符串等。cin函数可以与运算符>>结合使用,将用户输入的数据赋值给相应的变量。例如:

cpp 复制代码
int num;
cout << "请输入一个整数:";
cin >> num;
cout << "您输入的整数是:" << num << endl;

在上面的代码中,cin函数用于读取用户输入的整数,并将其赋值给变量num。然后,使用cout函数将变量num的值输出到屏幕上。

需要注意的是,cin函数会按照空格或回车键将输入的内容分割成多个部分,并分别赋值给相应的变量。可以使用getline函数来读取包含空格的字符串。

ps:cin函数也是自动识别类型的不需要我们像scanf一样打印类型

endl函数

函数名: endl

功能: 在输出流中插入一个换行符,并刷新输出缓冲区

用法示例:

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
   cout << "Hello, World!" << endl;
   // 或者
   cout << "Hello, World!" << '\n' << flush;  // '\n'为换行符, flush刷新输出缓冲区
   return 0;
}

解释: endl是C++标准库中iostream头文件中的一个输出控制符。当在输出流中插入endl时,它会在输出流中插入一个换行符,并刷新输出缓冲区。刷新输出缓冲区的作用是将缓冲区中的内容立即刷新到输出设备上,而不是等待缓冲区满或程序结束时才刷新。

三、C++输入和输出的说明

  1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件
    以及按命名空间使用方法使用std
  2. coutcin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含<iostream>头文件中。
  3. <<是流插入运算符,>>是流提取运算符。
  4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。C++的输入输出可以自动识别变量类型。
  5. 实际上coutcin分别是ostreamistream类型的对象,>><<也涉及运算符重载等知识,这些我将在后续文章讲解

注意 :早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;旧编译器(vc 6.0)中还支持<iostream.h>格式,后续编译器已不支持,因此推荐使用<iostream>+std的方式。

c 复制代码
#include <iostream>
using namespace std;
 
int main()
{
   int a;
   double b;
   char c;
     
   // 可以自动识别变量的类型
   cin>>a;
   cin>>b>>c;
     
   cout<<a<<endl;
   cout<<b<<" "<<c<<endl;
   return 0;
}

printf、scanf和cout、cin的区别

printfscanf是C语言的标准输入输出函数,而coutcin是C++语言的输入输出流对象。

主要区别如下:

  1. 语法:printfscanf使用C语言的函数调用语法,而coutcin使用C++的流对象调用语法。
  2. C++特性:coutcin支持C++的一些特性,如运算符重载、类型安全等。而printfscanf没有这些特性。
  3. 格式化输出:printfscanf可以使用格式控制符进行格式化输出和输入,而coutcin通常使用<<>>运算符来实现格式化输出和输入。
  4. 错误处理:printfscanf的错误处理相对简单,它们返回一个错误代码来指示是否成功。而coutcin则使用C++的异常机制来处理错误。
  5. 功能:coutcin提供了更多的功能,包括自动类型转换、流控制、格式化输出等。

总的来说,printfscanf是C语言的输入输出函数,功能相对简单,而coutcin是C++语言的输入输出流对象,功能更丰富,更方便使用。这两种方法可以根据读者自己的喜好选择合适的来使用

cout函数和cin函数控制精度和宽度

关于控制精度和宽度,在我看来在某些条件下C++的方法不如C语言的方法,我们可直接使用printfscanf完美解决

控制精度:

使用cout函数输出浮点数时,可以使用setprecision函数来控制输出的精度。setprecision函数位于<iomanip>头文件中,可以通过调用它来设置输出的精度。例如:

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

int main() {
    double num = 3.14159265358979323846;
    std::cout << std::setprecision(5) << num << std::endl; // 输出3.1416
    std::cout << std::setprecision(9) << num << std::endl; // 输出3.14159265
    return 0;
}

控制宽度:

使用cout函数输出时,可以使用setw函数来设置输出的宽度。setw函数位于<iomanip>头文件中,可以通过调用它来设置输出的宽度。例如:

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

int main() {
    int num = 123;
    std::cout << std::setw(5) << num << std::endl; // 输出  123(5个宽度)
    std::cout << std::setw(3) << num << std::endl; // 输出 123(3个宽度不够时会自动扩展)
    return 0;
}

控制输入的精度和宽度:

使用cin函数输入时,可以使用setprecisionsetw函数来设置输入的精度和宽度。例如:

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

int main() {
    double num;
    std::cin >> std::setprecision(5) >> num; // 输入3.1416,只保留五位有效数字
    std::cout << num << std::endl;

    int num2;
    std::cin >> std::setw(3) >> num2; // 输入 123,只读取三个字符
    std::cout << num2 << std::endl;

    return 0;
}

注意:setprecisionsetw函数只对之后的输出或输入起作用,并且它们的效果是持续的,直到下次被修改或程序结束。

std命名空间的使用惯例

std是C++标准库的命名空间,如何展开std使用更合理呢?

  1. 在日常练习中,建议直接using namespace std即可,这样就很方便。
  2. using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 + using std::cout展开常用的库对象/类型等方式。

相关推荐
2202_754421545 分钟前
生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件
java·linux·开发语言
我只会发热12 分钟前
Java SE 与 Java EE:基础与进阶的探索之旅
java·开发语言·java-ee
懷淰メ22 分钟前
PyQt飞机大战游戏(附下载地址)
开发语言·python·qt·游戏·pyqt·游戏开发·pyqt5
hummhumm36 分钟前
第 22 章 - Go语言 测试与基准测试
java·大数据·开发语言·前端·python·golang·log4j
宁静@星空42 分钟前
006-自定义枚举注解
java·开发语言
幽兰的天空1 小时前
默语博主的推荐:探索技术世界的旅程
学习·程序人生·生活·美食·交友·美女·帅哥
hummhumm1 小时前
第 28 章 - Go语言 Web 开发入门
java·开发语言·前端·python·sql·golang·前端框架
武子康1 小时前
Java-07 深入浅出 MyBatis - 一对多模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据库·sql·mybatis·springboot
珹洺1 小时前
C语言数据结构——详细讲解 双链表
c语言·开发语言·网络·数据结构·c++·算法·leetcode
每天吃饭的羊1 小时前
python里的数据结构
开发语言·python