在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位窗口上。我尝试以管理员身份运行此代码......没有任何区别。
谢谢!
答案 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 的描述来看,这似乎是等效的,而且它目前似乎确实有效。