Fstream 在点击 EOF 时读取行为

fstream read behavior upon hitting eof

本文关键字:读取 EOF Fstream      更新时间:2023-10-16

1.如果fstream::read((在读取长度字段的足够字符之前命中eof会发生什么?

2.在这种情况下,我如何知道已经读取了多少个字符?

谢谢

while(in_file.read(buffer, buffer_length)){
//what happens if eof not at the end of size buffer_length
            temp = sendto(sender_socket, buffer, sizeof(buffer), 0, NULL, 0); 
            byte_count += temp;
            msg_count ++;
}

我在这里要做的是以固定长度的文件读取并发送给sender_socket但是对于最后一条消息,缓冲区很可能未填充,而不是 sizeof(buffer( 我如何确定我发送的大小。这些文件将采用二进制形式。

从文档中:

如果在成功读取n字符之前输入序列用完要提取的字符(即到达文件末尾(,则 s 指向的数组包含在此之前读取的所有字符,并且为流设置了 eofbitfailbit 标志。
...
此函数成功读取和存储的字符数可以通过调用成员gcount访问。

所以你可以做到:

while(in_file.read(buffer, buffer_length)){
    temp = sendto(sender_socket, buffer, sizeof(buffer), 0, NULL, 0); 
    byte_count += temp;
    msg_count ++;
}
streamcount n = in_file.gcount();
if (n > 0) { // read a partial buffer
    temp = sendto(sender_socket, buffer, n, 0, NULL, 0);
    byte_count += temp;
    msg_count++;
}