赞
踩
参考C++ IOStream
IOStream 采用流式 I/O 而非记录 I/O ,但可以在此基础上引入结构信息
不涉及数据表示形式的变化
使用移位操作符来进行的输入 (>>) 与输出 (<<)
#include<iostream>
int main()
{
int x(22);
std::cout.setf(std::ios_base::showpos);//显示+
std::cout << x << std::endl;
std::cout.width(10);
std::cout << x << std::endl;
std::cout.width(10);//触发后被重置
std::cout.fill('.');
std::cout << x << std::endl;
return 0;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z2nlZ1OX-1639836672530)(d96a81291d7a0dbbdf596bdb414400e9.png)]
#include<iostream>
#include<iomanip>
int main()
{
int x(22);
std::cout <<std::showpos<< std::setw(10)<<std::setfill('.')
<< x << std::endl;
return 0;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Q9H4iCb-1639836672533)(98fb403f49c168ac5baa41ffe2ad921b.png)]
比如接受int 即使输入+10 空格10,接受的是10。
#include<iostream>
#include<string>
int main()
{
std::string z;
std::cin >> z;
std::cout << z << std::endl;
char x[5];
std::cin >> x;// 输入太长会越界。
std::cin >> std::setw(4)>>x;// 这样可以限制。
std::cout << x << std::endl;
return 0;
}
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
std::ofstream outFile("my_file");
// ...or
std::ofstream outFile;
outFile.open("my_file");
outFile << "hello "
outFile.close();
cout << outFile.is_open() << endl;
return 0;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2sd0rfCk-1639836672534)(6feea5c5a101d6a8a7b0ac91c84fc21e.png)]
只输入文件名其实是缺省初始化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zy7ZAj4r-1639836672534)(514c67803e2d386fcdd1cc43ff40d8d2.png)]
::binary 能禁止系统特定的转换:: 比如"\n"不转换为回车
避免意义不明确的流使用方式(如 ifstream + out )
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xbk3Ha19-1639836672535)(1a4f05d49664b1334bf10ff214813a4e.png)]
#include<iostream> #include<sstream> #include<string> using namespace std; int main() { std::ostringstream obj1 ; obj1 << 1234;//格式化 整数转字符串 string res = obj1.str(); cout << res << endl;//输出字符串1234 std::istringstream obj2(res) ; int x; obj2 >> x; cout << x << endl;//输出int 1234 return 0; }
#include<iostream>
#include<sstream>
#include<string>
using namespace std;
int main()
{
std::ostringstream obj1("1231231");
auto c_res = obj1.str().c_str();
//这是错误的 ,obj1.str()返回右值,用auto接受会变成指针,后续无法访问销毁的内存。
cout << c_res << endl;
}
通过string字符串 str += “…” 方法会不断开辟内存拷贝释放,浪费资源
使用内存流 obj << “…” 会提升性能
std::ios_base::iostate 位掩码类型
例如:
goodbit – 0000,0000 #
badbit – 0000,0001 # 不可恢复的流错误
faibit – 0000,0010 # 输入输出操作失败(格式化或提取错误)
eofbit– 0000,0100 # 关联的输入序列已经抵达末尾
检测流的状态
#include<iostream>
using namespace std;
int main()
{
int x;
cin >> x;
cout << cin.good();
...
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tJev7ViG-1639836672535)(b7397d59378785343151352f8758bf70.png)]
– 可能会被同时设置,但二者含意不同
– 转换为 bool 值时不会考虑 eof
– tellg() / tellp() 可以用于获取输入 / 输出流位置 (pos_type 类型 )
– 两个方法可能会失败,此时返回 pos_type(-1)
#include<iostream> #include<sstream> #include<string> using namespace std; int main() { std::ostringstream s; cout << s.tellp() << '\n'; s << "h"; cout << s.tellp() << '\n'; s << "ello, world "; cout << s.tellp() << '\n'; s << 3.14 <<"\n"; cout << s.tellp() << '\n'<< s.str(); }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pILy9UiE-1639836672536)(582a4f410f9e839ba342aad15a96bea0.png)]
tellp()/ tellg()返回的是下一个可以写入/读取的位置
– flush() 用于输出流同步,刷新缓冲区
– sync() 用于输入流同步,其实现逻辑是编译器所定义的
– 输出流可以通过设置 unitbuf 来保证每次输出后自动同步
cout<<std::unitbuf 关掉缓存区直接刷新。
– 流可以绑定到一个输出流上,这样在每次输入 / 输出前可以刷新输出流的缓冲区
– 比如: cin 绑定到了 cout 上
– 缺省情况下, C++ 的输入输出操作会与 C 的输入输出函数同步
– 可以通过 sync_with_stdio 关闭该同步
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。