为什么std :: istream :: ignore discard characters?

时间:2018-02-22 07:50:48

标签: c++ istream

std::istream::ignore的{​​{3}}上,它说

  

istream& ignore (streamsize n = 1, int delim = EOF);

     

提取并放弃字符

     

从输入中提取字符   序列并丢弃它们,直到n个字符为止   提取,或者一个比较等于delim。

为什么说它丢弃它们而不是退还它们

修改

根据要求,这是特定的代码。它是一个回调函数,服务器端,处理发送的客户端文件(_data

static void loadFile (const std::string &_fileName, std::vector<char> &_data)                                                                                            
{
    std::ifstream ifs;
    ifs.exceptions(std::ifstream::failbit);
    ifs.open(_fileName, std::ifstream::in | std::ifstream::binary);
    auto startPos = ifs.tellg();
    ifs.ignore(std::numeric_limits<std::streamsize>::max());
    auto size = static_cast<std::size_t>(ifs.gcount());
    ifs.seekg(startPos);
    _data.resize(size);
    ifs.read(_data.data(), size);
    std::cout << "loaded " << size << " bytes" << std::endl;
}   

2 个答案:

答案 0 :(得分:1)

  

为什么它会丢弃它们而不是退还它们?

因为还有其他功能可以返回它们。见std::istream::getline  和std::getline

<强>更新

更新后的帖子中以下几行的全部目的是获取文件的大小。

auto startPos = ifs.tellg();
ifs.ignore(std::numeric_limits<std::streamsize>::max());
auto size = static_cast<std::size_t>(ifs.gcount());

这是我第一次看到使用istream::ignore()来做到这一点。您还可以使用以下内容来获取文件的大小。

// Find the end of the file
ifs.seekg(0, std::ios::end);

// Get its position. The returned value is the size of the file.
auto size = ifs.tellg();

答案 1 :(得分:1)

auto startPos = ifs.tellg();

这会将位置存储在(刚刚打开的)文件的开头。

ifs.ignore(std::numeric_limits<std::streamsize>::max());

这将读取整个文件(直到EOF)并丢弃读取的内容。

auto size = static_cast<std::size_t>(ifs.gcount());

gcount返回上次未格式化的输入操作读取的字符数,在本例中为ignore。由于ignore读取文件中的每个字符,因此这是文件中的字符数。

ifs.seekg(startPos);

这会将流重新定位回文件的开头

_data.resize(size);

...分配足够的空间来存储整个文件的内容,

ifs.read(_data.data(), size);

最后再次将其读入_data