Lecture4
Lecture4
What are streams?
流: 对输入输出的一种抽象。留在数据和数据的字符串表示形式之间进行转换。
典型流: cout
可以打印任何初始类型和大多数STL类型。
“std::cout is an output stream.It has type std::ostream” std::cout 是一个输出流。它的类型为 std::ostream
“Two ways to classify streams” 流分类的两种方法
- By Direction:
Input streams | reading data(‘std::istream‘) |
Output streams | writing data(‘std::ostream‘) |
Input/Output streams | both(‘std::iostream‘) |
2. By Source or Destination:
Console streams | read/write to console(‘std::out‘) |
File streams | read/write to files(‘std::fstream‘) |
String streams | read/write to strings(‘std::stringstream‘) |
Output Streams
-
有类型`std::ostream`
-
只能够向流中发送数据
- 使用`<<`运算符来和流交互
- 将任何类型转换为字符串并且发送到流中
-
std::cout 是转到控制台的输出流
Output File Streams
-
类型`std::ofstream`
-
“Only send data using the << operator”
- 将任意类型的数据转换为字符串并发送给文件流
-
必须初始化链接到您的文件的您自己的 ofstream 对象
std::ofstream out("out.txt");
// out 现在是一个输出流输出目标是out.txt
out<<5<<std::endl; //在out.txt中输出5
Input Streams
“A note about nomenclature”:关于命名的解释
- `>>`是流提取操作符(从流中提取数据并把它置于变量中)
- `<<`是流插入操作符(将数据从流中输出到文件,控制台或者字符串)
“Input Streams” 输入流
- `std::istream`
- 只能使用`>>`来获取字符串
- std::cin 是从控制台获取输入的输入流
“Nitty Gritty Details: std::cin” 详细信息:std::cin
-
第一次调用 std::cin >> 创建一个命令行提示符,允许用户键入直到按 Enter 键
-
每个 >> 只读取直到下一个空格
-
第一个空格之后的所有内容都会被保存并在下次调用 std::cin >> 时使用
- 它保存的地方称为缓冲区!
-
如果缓冲区中没有任何内容,则 std::cin >> 创建一个新的命令行提示符
-
空格被吃掉;它不会出现在输出中
Input Streams: When things go wrong
第一种情况:当cin输入出错时不会发生崩溃,而是会存0来暗示错误
std::string str;
int x;
std::cin >> str >> x;
std::cout << str << " " << x <<std::endl;
对于以下代码
std::string str;
int x;
std::string otherStr;
//what happens if input is blah blah blah? std::cin >> str >> x>>otherStr; std::cout << str << " " << x << " " <<otherStr<< std::endl;
str | blah |
x | 0 |
otherStr | NOTHING |
once an error is detected, the input stream’s fail bit is set, and it will no longer accept input
第二种情况:当输入数据类型不对时,比如接受int但是输入double,会读取直到找到不是 int 的东西!
// 输入2.14
int age; double hourlyWage;
cin>>age; // age 2
cin>>hourlyWage; // hourlyWage 0.14
Questions
std::getline()
//Used to read a line from an input stream
//Function Signature
istream& getline(istream& is, string& str, char delim);
- is: getline reads from
- str: stores output in
- delim: Stops when read.’\n’=default
How it works:
-
清空str
-
从
is
中提取字符并且存在str
中,直到:- 文件读取完,设置
EOF
位(checked using is.eof()) is
下一个字符在delim
中,会提取但是不会存储str
超出内存, 设置FAIL
位(checked using is.fail())
- 文件读取完,设置
-
“If no chars extracted for any reason, FAIL bit set”
如果由于任何原因没有提取到字符,则设置 FAIL 位
diffs
- “>>“只会读取直到空格为止, 不能读入整个句子
- “>>“会把读入的数据转化为对应的数据类型,getline只能产生字符串
- “>>“只能停在预先定义好的空格, getline的停止可以自定义
Don’t mix >> with getline
- >> 读取直到下一个空白字符并且不会超过该空白字符。
- getline 读取到下一个分隔符(默认情况下为“\n”),并且确实会越过该分隔符。
“Stringstreams” 字符串流
- What: A stream that can read from or write to a string object
- Purpose: Allows you to perform input/output operations on a string as if it were a stream
#include<bits/stdc++.h>
int main() {
std::string input = "123";
std::stringstream stream(input);
int num;
stream >> num;
std::cout << num << std::endl; // outputs 123
}