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

时间:2015-08-03 21:37:36

标签: c++ ios c++11 stream std

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

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

imagescale($image,$width,$height, IMG_BICUBIC_FIXED);

输出结果为:

#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());
}
}

在msvc中编译时,我得到了     2&gt; ------ Build build:Project:StreamTest,配置:调试x64 ------ depends.exe也显示其64位,并链接到许多64位库。

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

  • 为什么会这样?
  • 我该怎么办? (不,我不想使用提升)
  • msvc 2015还会发生这种情况吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我刚刚下载并安装了msvc2015社区版。此版本中出现 not 的问题。

由于其他原因与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 的描述来看,这似乎是等效的,而且它目前似乎确实有效。