single character
int get();
istream& get (char& c);
功能:从流中提取单个字符。返回该字符(第一个方法),或将其设置为参数的值(第二个方法)。
c-string
istream& get (char* s, streamsize n);
istream& get (char* s, streamsize n, char delim);
从流中提取字符并将其作为c字符串存储在s中,直到提取(n-1)个字符或遇到定界字符为止:定界字符为换行符(’\ n’)或delim (如果指定了此参数)。
如果找到了分隔符,则不会从输入序列中将其提取出来,而是保留在那里,作为要从流中提取的下一个字符(有关删除分隔符的替代方法,请参见getline)。
如果n大于零,即使提取了一个空字符串,也会自动将一个空字符(’\ 0’)附加到写入的序列中。
stream buffer
istream& get (streambuf& sb);
istream& get (streambuf& sb, char delim);
从流中提取字符,并将其插入到流缓冲区对象sb控制的输出序列中,一旦插入失败或输入序列中遇到定界字符,则停止(定界字符为换行符) 字符,’\ n’或delim(如果指定了此参数)。
从流中仅提取成功插入sb中的字符:既不会从输入序列中提取定界字符,也不会最终未能在sb中插入的字符从输入序列中提取,并保留在那里,作为下一个要从流中提取的字符。
样例:
std::string s("25Hello5World#Test");
std::istringstream iss(s);
// get
// get single character
std::cout << iss.get() << std::endl;
std::cout << "iss.tellg(): " << (int)iss.tellg() << std::endl;
char c;
iss.get(c);
std::cout << c << std::endl;
std::cout << "iss.tellg(): " << (int)iss.tellg() << std::endl;
// get c-string
char str[10];
iss.get(str, 6);
std::cout << str << std::endl;
std::cout << "iss.tellg(): " << (int)iss.tellg() << std::endl;
iss.get(str, 8, '#');
std::cout << str << std::endl;
std::cout << "iss.tellg(): " << (int)iss.tellg() << std::endl;
输出:
50
iss.tellg(): 1
5
iss.tellg(): 2
Hello
iss.tellg(): 7World
iss.tellg(): 12
istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );
从流中提取字符作为未格式化的输入,并将它们作为c字符串存储到s中,直到提取的字符是定界字符,或者将n个字符写入s(包括终止的空字符)为止。
分隔字符是第一种形式的换行符(’\ n’),第二种形式是delim:在输入序列中找到时,将从输入序列中提取出来,但将其丢弃并且不写入s中。
如果到达文件末尾,该函数还将停止提取字符。如果过早达到此要求(在写入n个字符或找到delim之前),该函数将设置eofbit标志。
如果函数未提取任何字符,或者一旦已经将(n-1)个字符写入s,则找不到分隔字符,则将设置failbit标志。请注意,如果在输入序列中紧跟着(n-1)个字符的字符是定界字符,则还将提取该字符,并且未设置故障位标志(提取的序列正好是n个字符长)。
如果n大于零,即使提取了一个空字符串,也会在写入的序列后自动添加一个空字符(’\ 0’)。
在内部,该函数通过首先构造一个哨兵对象(将noskipws设置为true)来访问输入序列。然后(如果良好),它将从其关联的流缓冲区对象中提取字符,就像调用其成员函数sbumpc或sgetc一样,并最终在返回之前销毁哨兵对象。
可以通过调用成员gcount来访问此函数成功读取和存储的字符数。
样例:
std::string s("25HelloWorld#Test");
std::istringstream iss(s);
// getline
iss.seekg(0);
char strLine[256];
iss.getline(strLine, 256);
std::cout << strLine << std::endl;
std::cout << "getline gcount: " << iss.gcount() << std::endl;
std::cout << "iss.tellg(): " << (int)iss.tellg() << std::endl;
输出:
25HelloWorld#Test
getline gcount: 17
iss.tellg(): -1
istream& read (char* s, streamsize n);
Read block of data
从流中提取n个字符并将其存储在s指向的数组中。
此函数仅复制数据块,而不检查其内容或在末尾添加空字符。
如果在成功读取n个字符之前输入序列用完了要提取的字符(即到达文件末尾),则s指向的数组将包含直到该点之前读取的所有字符,并且eofbit和 为流设置了故障位标志。
在内部,该函数通过首先构造一个哨兵对象(将noskipws设置为true)来访问输入序列。 然后(如果良好),它将从其关联的流缓冲区对象中提取字符,就像调用其成员函数sbumpc或sgetc一样,并最终在返回之前销毁哨兵对象。
可以通过调用成员gcount访问此函数成功读取和存储的字符数。
样例:
std::string s("25HelloWorld#Test");
std::istringstream iss(s);
// read
iss.seekg(0);
std::cout << "iss.tellg(): " << (int)iss.tellg() << std::endl;
//char* buff = new char[256];
char buff[256] = {0}; // 需初始化
iss.read(buff, 256);
std::cout << buff << std::endl;
std::cout << "getline gcount: " << iss.gcount() << std::endl;
std::cout << "iss.tellg(): " << (int)iss.tellg() << std::endl;
输出:
iss.tellg(): 0
25HelloWorld#Test
getline gcount: 17
iss.tellg(): -1
从流中读取数据,可以使用operator>>来获取,粒度比较粗,并且arithmetic types(算术类型)时,会将字符集转换为相应的类型值(此处会比较耗时)。
使用get、getline、read来按照字节数来进行获取。(多用于binary存储和读取)