read,readsome,get和getline之间有什么区别?

时间:2014-05-14 20:09:03

标签: c++

这些功能有什么区别。当我使用它们时,它们都做同样的事情。例如,所有三个调用都返回"hello"

#include <iostream>
#include <sstream>

int main()
{
    stringstream ss("hello");
    char x[10] = {0};
    ss.read(x, sizeof(x));          // #1
    std::cout << x << std::endl;
    ss.clear();
    ss.seekg(0, ss.beg);
    ss.readsome(x, sizeof(x));      // #2
    std::cout << x << std::endl;
    ss.clear();
    ss.seekg(0, ss.beg);
    ss.get(x, sizeof(x));           // #3
    std::cout << x;
    ss.clear();
    ss.seekg(0, ss.beg);
    ss.getline(x, sizeof(x));       // #4
    std::cout << x << std:endl;
}

3 个答案:

答案 0 :(得分:17)

当使用参数get调用getline时,

get( char_type* s, std::streamsize count )非常相似。但是,get从流中读取,直到找到分隔符,然后将其保留在那里。相比之下,getline会将分隔符从流中拉出,但随后将其删除。它不会被添加到它填充的缓冲区中。

get查找\n,当参数中提供了特定数量的字符(例如count)时,它会在停止前读取count - 1个字符。 read将提取所有count个。

您可以设想read是对二进制数据源的适当操作,读取特定数量的字节。 get更适合于文本流,当你读到一个你想要以null结尾的字符串时,以及像换行符这样的东西在分割文本时会有有用的句法意义。

readsome只返回底层缓冲区中立即可用的字符,这有点模糊不清并且特定于实现。这可能包括使用putback返回到流的字符。您无法看到readreadsome之间的区别这一事实表明两者可能共享您正在使用的特定流类型和库的实现。

答案 1 :(得分:6)

我已经在闪存归档系统中发现了read()readsome()之间的区别。

基础流读取8k块,read方法将用于下一个块以满足调用者,而readsome方法允许返回少于请求以避免花费时间获取下一个块。

答案 2 :(得分:0)

get()和getline()之间的主要区别在于get()在输入流中留下换行符,使其成为下一个输入操作看到的第一个字符,而getline()则提取并丢弃换行符来自输入流。