C++输入和输出
前言
C++中的输入和输出主要通过标准库中的iostream
类实现。使用cin
对象从标准输入(如键盘)读取数据,使用cout
对象将数据写入标准输出(如屏幕)。
可能大家总是会看到像这样的头文件#include<bits/stdc++.h>
,其实这个头文件包含的是C++里大多数的头文件,在参加竞赛的时候就不需要花时间来写很多头文件了,直接写这一个就够了
一、C++打印Hello World
新生婴儿会以自己独特的方式向这个崭新的世界打招呼,C++刚出来后,也算是一个新事物,
那C++是否也应该向这个美好的世界来声问候呢?我们来看下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位)为单位进行读写。它提供了一种通用的方式来处理任意类型的数据,包括文本、图片、音频等。常见的字节流类有InputStream
和OutputStream
。
字符流以字符(16位)为单位进行读写。它提供了更方便的方式来处理文本数据,支持字符的编码和解码。常见的字符流类有Reader
和Writer
。
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
函数的原型为:
std::ostream& cout (std::ostream& os);//&在c++中可以是取地址,也可以是取别名,具体可看后续文章讲解
cout
函数可以接受各种数据类型作为参数进行输出,并且可以通过运算符重载的方式实现对不同数据类型的输出。使用cout
函数进行输出时,可以使用插入运算符(<<
)来将数据插入到输出流中。
例如,输出一个整数可以使用以下语句:
int num = 10;
cout << num;
输出一个字符串可以使用以下语句:
std::string str = "Hello, world!";
cout << str;
cout
函数可以与其他输出操作符一起使用,以便于输出多个数据。
int num1 = 10;
int num2 = 20;
cout << "Numbers: " << num1 << " and " << num2;
上述代码输出结果为:"Numbers: 10 and 20"
。
cin函数
cin
函数是C++语言中的标准输入流函数,用于从用户输入获取数据。它可以读取各种类型的数据,如整数、浮点数、字符、字符串等。cin
函数可以与运算符>>
结合使用,将用户输入的数据赋值给相应的变量。例如:
int num;
cout << "请输入一个整数:";
cin >> num;
cout << "您输入的整数是:" << num << endl;
在上面的代码中,cin
函数用于读取用户输入的整数,并将其赋值给变量num
。然后,使用cout
函数将变量num
的值输出到屏幕上。
需要注意的是,cin
函数会按照空格或回车键将输入的内容分割成多个部分,并分别赋值给相应的变量。可以使用getline
函数来读取包含空格的字符串。
endl函数
函数名: endl
功能: 在输出流中插入一个换行符,并刷新输出缓冲区
用法示例:
#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++输入和输出的说明
- 使用
cout
标准输出对象(控制台)和cin
标准输入对象(键盘)时,必须包含< iostream >
头文件
以及按命名空间使用方法使用std
。 cout
和cin
是全局的流对象,endl
是特殊的C++符号,表示换行输出,他们都包含在包含<iostream>
头文件中。<<
是流插入运算符,>>
是流提取运算符。- 使用C++输入输出更方便,不需要像
printf/scanf
输入输出时那样,需要手动控制格式。C++的输入输出可以自动识别变量类型。 - 实际上
cout
和cin
分别是ostream
和istream
类型的对象,>>
和<<
也涉及运算符重载等知识,这些我将在后续文章讲解
注意:早期标准库将所有功能在全局域中实现,声明在.h
后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std
命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h
;旧编译器(vc 6.0)中还支持<iostream.h>
格式,后续编译器已不支持,因此推荐使用<iostream>+std
的方式。
#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的区别
printf
和scanf
是C语言的标准输入输出函数,而cout
和cin
是C++语言的输入输出流对象。
主要区别如下:
- 语法:
printf
和scanf
使用C语言的函数调用语法,而cout
和cin
使用C++的流对象调用语法。 - C++特性:
cout
和cin
支持C++的一些特性,如运算符重载、类型安全等。而printf
和scanf
没有这些特性。 - 格式化输出:
printf
和scanf
可以使用格式控制符进行格式化输出和输入,而cout
和cin
通常使用<<
和>>
运算符来实现格式化输出和输入。 - 错误处理:
printf
和scanf
的错误处理相对简单,它们返回一个错误代码来指示是否成功。而cout
和cin
则使用C++的异常机制来处理错误。 - 功能:
cout
和cin
提供了更多的功能,包括自动类型转换、流控制、格式化输出等。
总的来说,printf
和scanf
是C语言的输入输出函数,功能相对简单,而cout
和cin
是C++语言的输入输出流对象,功能更丰富,更方便使用。这两种方法可以根据读者自己的喜好选择合适的来使用
cout函数和cin函数控制精度和宽度
关于控制精度和宽度,在我看来在某些条件下C++的方法不如C语言的方法,我们可直接使用printf
和scanf
完美解决
控制精度:
使用cout
函数输出浮点数时,可以使用setprecision
函数来控制输出的精度。setprecision
函数位于<iomanip>
头文件中,可以通过调用它来设置输出的精度。例如:
#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>
头文件中,可以通过调用它来设置输出的宽度。例如:
#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
函数输入时,可以使用setprecision
和setw
函数来设置输入的精度和宽度。例如:
#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;
}
注意:setprecision
和setw
函数只对之后的输出或输入起作用,并且它们的效果是持续的,直到下次被修改或程序结束。
std命名空间的使用惯例
std
是C++标准库的命名空间,如何展开std
使用更合理呢?
- 在日常练习中,建议直接
using namespace std
即可,这样就很方便。 using namespace std
展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以建议在项目开发中使用,像std::cout
这样使用时指定命名空间 +using std::cout
展开常用的库对象/类型等方式。