c++

您所在的位置:网站首页 tellg返回值 c++

c++

2023-04-17 11:26| 来源: 网络整理| 查看: 265

我遇到了一个奇怪的问题。假设我正在读取这样的文件:

std::ifstream in("file.txt", std::ios::binary); std::string text; in.seekg(0, std::ios::end); text.resize(in.tellg()); in.seekg(0, std::ios::beg); in.read(&text[0], text.size()); 当文件包含少于 4 个字符时会出现问题,即 "ab"或 "abc" ,但在其他情况下按预期工作,即 "abcd"或更大。

为什么是 tellg返回 -1对于这种情况(最终导致我的字符串抛出 std::length_error )?

附加信息:

我正在使用 MSVC 15.5.3(如果不是最新的,也是更现代的之一)。也使用 GCC 5.1 进行了复制。

等效的 C 样式不会发生此错误:

FILE* f = fopen("text.txt", "rb"); fseek(f, 0, SEEK_END); long fsize = ftell(f); 编辑:failbit在第一次调用 seekg 之前设置,意味着打开文件失败?为什么小于 3 字节的文件会出现这种情况...

最佳答案

经过几条评论,很明显 ifstream构造函数本身以某种方式失败,如 failbit甚至在 seekg 之前设置称呼。

由于几乎所有 I/O 操作在继续之前首先构造一个哨兵对象,这就是您的操作失败的原因。

所以我有几点建议。

首先,使用文件的完整路径名只是为了确保您不可能在输入文件所在的目录之外的目录中运行它。

其次,尝试以下在 g++ 5.4(a) 下运行的完整程序,看看它是否表现出相同的问题(您的代码虽然具有指示性,但并不完整)。

#include #include int main() { std::ifstream in("/full/path/to/file.txt", std::ios::binary); std::cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3