std::basic_istream<CharT,Traits>::read
< cpp | io | basic istream
basic_istream& read( char_type* s, std::streamsize count ); |
||
从流释出字符。
表现为无格式输入函数 (UnformattedInputFunction) 。构造并检查 sentry 对象后,释出字符并存储它们到首元素为 s
所指向的字符数组的相继位置。释出并存储字符,直至出现任何下列条件:
- 释出并存储了
count
个字符
- 输入序列上的文件尾条件(该情况下调用 setstate(failbit|eofbit) )。成功释出的字符数能用 gcount() 查询。
参数
s | - | 指向要存储字符到的字符数组的指针 |
count | - | 要读取的字符数 |
返回值
*this
异常
若内部操作抛出异常,则捕获它并设置 badbit 。若对 badbit
设置了 exceptions() ,则重抛该异常。
注意
使用非转换的本地环境时(默认本地环境为非转换),此函数在 std::basic_ifstream 中的覆写者可以为零复制的大块 I/O 优化(通过覆写 std::streambuf::xsgetn )。
示例
运行此代码
#include <iostream> #include <fstream> #include <sstream> #include <string> #include <cstdint> int main() { // read() 常用于二进制 I/O std::string bin = {'\x12', '\x12', '\x12', '\x12'}; std::istringstream raw(bin); std::uint32_t n; if(raw.read(reinterpret_cast<char*>(&n), sizeof n)) std::cout << std::hex << std::showbase << n << '\n'; // 为下个片段准备文件 std::ofstream("test.txt", std::ios::binary) << "abcd1\nabcd2\nabcd3"; // 读取整个文件到 string if(std::ifstream is{"test.txt", std::ios::binary | std::ios::ate}) { auto size = is.tellg(); std::string str(size, '\0'); // 构造 string 为流大小 is.seekg(0); if(is.read(&str[0], size)) std::cout << str << '\n'; } }
输出:
0x12121212 abcd1 abcd2 abcd3
参阅
插入字符块 ( std::basic_ostream<CharT,Traits> 的公开成员函数) | |
提取带格式数据 (公开成员函数) | |
读并取走已经可用的字符块 (公开成员函数) | |
从流中读并取走(移除类似指针向下一个元素移动)一个字符 (公开成员函数) | |
一直读并取走字符,直至找到给定字符 (公开成员函数) | |
从文件读取 (函数) |