为什么 std::istream::ignore 丢弃字符?
Why does std::istream::ignore discard characters?
在 CPlusPlus website 上 std::istream::ignore
,它说
istream& ignore (streamsize n = 1, int delim = EOF);
Extract and discard characters
Extracts characters from the input
sequence and discards them, until either n characters have been
extracted, or one compares equal to delim.
为什么说丢弃它们而不是returns它们?
编辑
根据要求,这是有问题的特定代码。它是一个回调函数,服务器端,处理发送的客户端文件(_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;
}
Why does it say it discards them rather than returns them?
因为return它们还有其他功能。参见 std::istream::getline
和 std::getline
更新
您更新的 post 中以下行的全部目的是获取文件的大小。
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();
auto startPos = ifs.tellg();
这存储了 (just-opened) 文件开头的位置。
ifs.ignore(std::numeric_limits<std::streamsize>::max());
这会读取整个文件(直到 EOF)并丢弃读取的内容。
auto size = static_cast<std::size_t>(ifs.gcount());
gcount
returns 最后一次未格式化输入操作读取的字符数,在本例中为 ignore
。由于 ignore
读取了文件中的每个字符,因此这是文件中的字符数。
ifs.seekg(startPos);
这会将流重新定位回文件的开头,
_data.resize(size);
...分配足够的 space 来存储整个文件的内容,
ifs.read(_data.data(), size);
最后再次读入 _data
。
在 CPlusPlus website 上 std::istream::ignore
,它说
istream& ignore (streamsize n = 1, int delim = EOF);
Extract and discard characters
Extracts characters from the input sequence and discards them, until either n characters have been extracted, or one compares equal to delim.
为什么说丢弃它们而不是returns它们?
编辑
根据要求,这是有问题的特定代码。它是一个回调函数,服务器端,处理发送的客户端文件(_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;
}
Why does it say it discards them rather than returns them?
因为return它们还有其他功能。参见 std::istream::getline
和 std::getline
更新
您更新的 post 中以下行的全部目的是获取文件的大小。
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();
auto startPos = ifs.tellg();
这存储了 (just-opened) 文件开头的位置。
ifs.ignore(std::numeric_limits<std::streamsize>::max());
这会读取整个文件(直到 EOF)并丢弃读取的内容。
auto size = static_cast<std::size_t>(ifs.gcount());
gcount
returns 最后一次未格式化输入操作读取的字符数,在本例中为 ignore
。由于 ignore
读取了文件中的每个字符,因此这是文件中的字符数。
ifs.seekg(startPos);
这会将流重新定位回文件的开头,
_data.resize(size);
...分配足够的 space 来存储整个文件的内容,
ifs.read(_data.data(), size);
最后再次读入 _data
。