C++ | 12天学好C++ (Day 10)->结构图可视化、代码加通俗理解
为每天进步一点点而努力。
C++是计算机视觉的重要的一部分,虽然在初始学习时Python应用比较广,但是大多数公司还是C++做计算机视觉类的比较多,因为C++可加密,所以我们来一起探索吧!看了这系列博客,将会学到C++的基本操作!(如果不敲代码,可能会一知半解)
第十天-221008
目录
第十天-221008
chapter 11 C++输入输出系统
11.1.cin,cout,cerr
11.2.ostream的成员函数
11.3.istream的成员函数
11.4.输入运算符<<和输出运算符>>
总结
参考文献
chapter 11 C++输入输出系统
数据以一系列字节形式(称为流)从 / 传输到输出/输入设备。输入流从输入设备(如键盘)流向主内存的操作。
另一方面,输出行为是从主内存流向输出设备(如屏幕)的流。
c++中定义的标准输入输出流是istream和ostream,他们是iostream类的父类,而cin是istream的对象,cout是ostream的对象。头文件fstream(对文件操作的流)包含了ifstream和ofstream,头文件sstream(对字符串操作的流)包含了istringstream和ostringstream,这些类都是继承自istream和ostream的。
它们的关系如下图【2】:
- EOF: eof是end of file的缩写,表示“文件结束”。从输入流读取数据,如果到达文件末尾(遇文件结束符),eof函数值为非零值(真),否则为0(假)。
11.1.cin,cout,cerr
cin、cout、cerr 和堵塞是处理标准输入和输出的流。这些是在 iostream 头文件中定义的流对象。
std::cin 是类 istream 的一个对象,它表示面向窄字符(字符类型)的标准输入流。它对应于 C 流标准。标准输入流是由环境确定的字符源。cin 是所连接的输入设备的键盘。
std::cout 是类 ostream 的一个对象,它表示面向窄字符(字符类型)的标准输出流。它对应于 C 流标准。标准输出流是由环境确定的字符的默认目标。此目标可能与更多标准对象(如 cerr 或堵塞)共享。Cout 也称为运算符“ <<”,并将插入运算符信息或数据输出到输出设备。显示屏幕通常是连接 cout 对象的输出设备。
对象 cerr 控制与对象 stderr 关联的流缓冲区的输出,该缓冲区在 <cstdio> 中声明。它用于将错误输出到标准输出流。
注 −此标头中声明的所有对象都共享一个特殊属性 - 您可以假设它们是在您定义的任何静态对象之前构造的,在包含<iostream>的翻译单元中。同样,您可以假定在您定义的任何此类静态对象的析构函数之前不会销毁这些对象。(但是,输出流在程序终止期间将被刷新。因此,您可以在程序启动之前和程序终止后安全地读取或写入标准流。
您可以按如下方式使用这些流对象 −
#include<iostream>
int main() {
int my_int;
std::cin >> my_int;
std::cout << my_int;
std::cerr << "An error message";
return 0;
}
输入11,结果为
11.2.ostream的成员函数
put()插入一个字符
write() 插入一字节序列
flush() 刷新输出流
#include<iostream>
/* ostream & put(char ch)
ostream & write(char*str,int n)
ostteam & flush()
*/
int main() {
std::cout.put('A') ;
std::cout.put(33);//打印ASCII编码的33个符号->!
char str[] = "I love u";
std::cout.write(str, 6);//只能输出i love,说明空格占一位
std::cout.flush();
//想要去掉‘std::’,在第二行添加‘using namespace std’;就可以
}
结果
11.3.istream的成员函数
C++标准库里有针对外设输入操作进行处理的类——istream。而常用的cin则是istream的类对象。因此实际上我们可以重新定义新的输入流对象代替cin对输入进行操作。而我们常用的istream类成员函数有如下一些:
int get(): 从指定的输入流中读入一个字符(包括空白字符);遇到输入流中的文件结束符时,此get函数返回EOF;
istream&get(char&ch):从输入流读取一个字符(包括空白字符),并将其存储在字符变量 c 中。事实上get(char& c)与get( )作用基本相同;
#include<iostream>
using namespace std;
/* int get()
istream & get(char&ch)
*/
void get1() {
cout << "cin.get()input,use enter";
int ch;
while ((ch = cin.get()) != EOF) {
cout.put(ch);
if (ch == '\n')
break;
}
}
void get2() {
cout << "cin.get(char&)input,use enter";
char ch;
while (true) {
cin.get(ch);
if (cin.eof())break;
cout.put(ch);
if (ch == '\n')
break;
}
}
int main() {
get1();
get2();
}
istream&get(char* s,int n):从输入流读取一个字符(包括空白字符),并将其存储在字符变量 c 中。事实上get(char& c)与get( )作用基本相同;
istream&get(char* s,int n,char delim='\n'):从输入流中读取n-1个字符,存于字符指针 s指向的内存。如果在读取n-1个字符之前遇到指定的终止字符delim,则提前结束读取。程序会自动在字符串最后增加一个’\0’表示结束;
istream&getline(char* s,int n,char delim='\n'):提取一行的字符串,s 是存储数据的变量的名字,n为输入数据的长度,delim为结束的标志字符(遇到就结束,不理会数据有多长,可以不要)
istream&ignore(int n=1,int delim-EOF):忽略输入流中的n个字符,或者当遇到输入流中有一个值等于delim时停止忽略并返回。
int gcount(streamsize num = 1, int delim = EOF):istream的成员函数gcount()返回上一次输入操作实际从输入流读取的字符个数,streamsize gcount() const;
long setf(long flags):设置状态标志flags
long unsetf(long flags):删除状态标志flags
11.4.输入运算符<<和输出运算符>>
<<
and运算符被>>
重载以处理基本类型(例如int
and double
)和类(例如string
)。您还可以为您自己的用户定义类型重载这些运算符。
cin <<
andcout >>
返回对 and 的引用,cin
因此cout
支持级联操作。
示例1
/* Testing Simple File IO (TestSimpleFileIO.cpp) */
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
using namespace std;
int main() {
string filename = "test.txt";
// Write to File
ofstream fout(filename.c_str()); // default mode is ios::out | ios::trunc
if (!fout) {
cerr << "error: open file for output failed!" << endl;
abort(); // in <cstdlib> header
}
fout << "apple" << endl;
fout << "orange" << endl;
fout << "banana" << endl;
fout.close();
// Read from file
ifstream fin(filename.c_str()); // default mode ios::in
if (!fin) {
cerr << "error: open file for input failed!" << endl;
abort();
}
char ch;
while (fin.get(ch)) { // till end-of-file
cout << ch;
}
fin.close();
return 0;
}
结果
- 大多数<fstream>
函数(例如构造函数open()
)仅支持 C 字符串中的文件名。可能需要通过成员函数从string
对象中提取 C 字符串c_str()。
- is_open()
用来检查文件是否打开成功。
- 该函数在到达文件末尾时get(char &)
返回一个空指针(转换为)false。
总结
C++ 提供格式化和未格式化的IO 函数。在格式化或高级 IO 中,字节被分组并转换为类型,例如int
, double
, string 或用户定义的类型。在未格式化或低级 IO 中,字节被视为原始字节并且未转换。通过重载流插入 ( <<
) 和流提取 ( >>
) 运算符支持格式化 IO 操作,这提供了一致的公共 IO 接口。
要执行输入和输出,C++ 程序:
- 构造一个流对象。
- 将流对象连接(关联)到实际的 IO 设备(例如,键盘、控制台、文件、网络、另一个程序)。
- 通过流的公共接口中定义的函数以与设备无关的方式对流执行输入/输出操作。一些函数在外部格式和内部格式之间转换数据(格式化的IO);而其他则没有(未格式化或二进制 IO)。
- 断开(Dissociate)流与实际 IO 设备的连接(例如,关闭文件)。
- 释放流对象。
参考文献
【1】What are cin, cout and cerr streams in C++? (tutorialspoint.com)
【2】C++中istream的使用_有点模糊的博客-CSDN博客_istream
【3】 C++ IO Streams and File Input/Output