gpt4 book ai didi

c++ - std::ofstream 无法在 win7/64 和 msvc2013 上使用 std::ios::ate 打开大文件

转载 作者:太空宇宙 更新时间:2023-11-04 13:30:12 24 4
gpt4 key购买 nike

在 windows7 x64 上,我试图修改一个现有的二进制文件,它位于 C: 的根目录中,它是一个 NTFS 文件系统。

以下代码是使用 MSVC Community 2013 (12.0.31101.00 Update 4) 编译的:

#include <QFileInfo>
#include <fstream> //std::ifstream
#include <iostream> // std::cout
#include <windows.h>

int main(int argc, char *argv[])
{
qDebug() << "sizeof(std::size_t):" << sizeof(std::size_t);
const QDir dir("c:\\");
const QStringList fileNames = dir.entryList(QStringList({ "*.tst" }), QDir::Files, QDir::Size | QDir::Reversed);

std::ios::openmode m = std::ios::out | std::ios::in | std::ios::binary | std::ios::ate;

for (int i = 0; i < fileNames.size(); i++)
{
const QString filename = dir.absoluteFilePath(fileNames.at(i));
const QFileInfo fileinfo(filename);
std::ofstream ofs(filename.toLatin1().constData(), m);
qDebug()
<< "ofstream on" << filename
<< "size" << fileinfo.size()
<< "\n\tis_open:" << ofs.is_open()
<< "\n\tgood:" << ofs.good()
<< "\n\tbad:" << ofs.bad()
<< "\n\teof:" << ofs.eof()
<< "\n\tfail:" << ofs.fail()
<< "\n\terror:" << strerror(errno)
<< "\n\tlastError:" << QString::fromStdString(GetLastErrorAsString());
}

// and now again, but without std::ios::ate
m = std::ios::out | std::ios::in | std::ios::binary;

for (int i = 0; i < fileNames.size(); i++)
{
const QString filename = dir.absoluteFilePath(fileNames.at(i));
const QFileInfo fileinfo(filename);
std::ofstream ofs(filename.toLatin1().constData(), m);
qDebug()
<< "ofstream on" << filename
<< "size" << fileinfo.size()
<< "\n\tis_open:" << ofs.is_open()
<< "\n\tgood:" << ofs.good()
<< "\n\tbad:" << ofs.bad()
<< "\n\teof:" << ofs.eof()
<< "\n\tfail:" << ofs.fail()
<< "\n\terror:" << strerror(errno)
<< "\n\tlastError:" << QString::fromStdString(GetLastErrorAsString());
}
}

输出是:

sizeof(std::size_t): 8
ofstream on "c:/4294967294.tst" size 4294967294
is_open: true
good: true
bad: false
eof: false
fail: false
error: No error
lastError: ""
ofstream on "c:/4294967295.tst" size 4294967295
is_open: false
good: false
bad: false
eof: false
fail: true
error: No error
lastError: ""

ofstream on "c:/4294967294.tst" size 4294967294
is_open: true
good: true
bad: false
eof: false
fail: false
error: No error
lastError: ""
ofstream on "c:/4294967295.tst" size 4294967295
is_open: true
good: true
bad: false
eof: false
fail: false
error: No error
lastError: ""

在 msvc 中编译时,我得到 2>------ 开始构建:项目:StreamTest,配置:Debug x64 ------depends.exe 还显示了它的 64 位,以及针对许多 64 位库的链接。

看来我无法使用 std::ios::ate 标志打开 >= (2^32)-1 字节的文件。我不太相信这种情况会发生在具有 NTFS 文件系统的 64 位 Windows 上。我尝试以管理员身份运行此代码...没有任何区别。

  • 为什么会这样?
  • 我能做什么? (不,我不想使用 boost)
  • 在 msvc 2015 中是否还会发生这种情况?

谢谢!

最佳答案

我刚刚下载并安装了 msvc2015 社区版。该问题没有出现在这个版本中。

虽然出于其他原因继续使用 msvc2013,但我没有使用 std::ios::ate 进行 ORing,而是

ofs.open("filename", std::ios::out | std::ios::in | std::ios::binary);
ofs.seekp(0, std::ios_base::end);

std::ios::ate 的描述来看,这似乎是等价的,而且它目前似乎确实有效。

关于c++ - std::ofstream 无法在 win7/64 和 msvc2013 上使用 std::ios::ate 打开大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31797172/

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