gpt4 book ai didi

c++ - tellg() 仅对小文件返回 -1

转载 作者:行者123 更新时间:2023-11-27 23:49:04 28 4
gpt4 key购买 nike

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

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 <iostream>
#include <fstream>

int main() {
std::ifstream in("/full/path/to/file.txt", std::ios::binary);
std::cout << "after open, good=" << in.good() << ", bad=" << in.bad()
<< ", fail=" << in.fail() << ", eof=" << in.eof() << std::endl;

std::cout << "seekg returns " << in.seekg(0, std::ios::end) << std::endl;
std::cout << "after seek, good=" << in.good() << ", bad=" << in.bad()
<< ", fail=" << in.fail() << ", eof=" << in.eof() << std::endl;

std::cout << "tellg returns " << in.tellg() << std::endl;
std::cout << "after tell, good=" << in.good() << ", bad=" << in.bad()
<< ", fail=" << in.fail() << ", eof=" << in.eof() << std::endl;
}

用两个字节和十个字节的文件试试这个。

如果这些都不能给您带来任何乐趣,那么应该让 Microsoft 和/或 GNU 意识到这个问题。前者可以做到here , 后者 here .


只是为了完整起见,我最初想到的唯一可能性是该文件虽然长三个字节,但在某种程度上是无效的。这取决于实际内容,所以,如果它只是abc ,您可以安全地忽略它。

我在想的是具有两个字节 BOM 和多字节 Unicode 代码点(例如 UTF-16)的第一个字节或 UTF-8 的前三个字节的 Unicode 文件四字节代码点。

但是,如果您以二进制模式打开它,这似乎难以置信不太可能,因此您可以安全地忽略它。


(a) 对于它的值(value),唯一我能让它拥有 failbit 的方法打开后设置为删除文件。即使使用空文件也没有出现您所描述的问题。

关于c++ - tellg() 仅对小文件返回 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48105862/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com