- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在 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 上。我尝试以管理员身份运行此代码...没有任何区别。
谢谢!
最佳答案
我刚刚下载并安装了 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/
我有这个小程序。 #include #include using namespace std; int main() { fstream f("file.txt", ios::out);
我的任务是用C++在一个精确的位置写入file.txt因为我的文件是静态的(它不会被改变)我决定计算我必须写的 cursur 的位置。 (我知道这不是最好的主意)这是我的文件,我必须在 '=' 之后写
#include #include int main() { const char* fileName = "out1"; std::ofstream fs1(fileName);
在下面提到的代码中,当我应用 ios::out 时它可以正常工作,但在 ios::ate 的情况下却不是这样,它显示文件中的某个位置 -1 并且无法写入文件。 其次peek()函数用在什么地方 代码:
我正在尝试使用 C++ 获取文件的文件大小。代码是这样的: ifstream fin(filepth, ios::in | ios::binary | ios::ate); if (!fin
我正在使用 Visual Studio 2017 练习 C++,我在 TurboC++ 上有一些 C++ 的经验。尝试创建一个从文件读取和写入的程序,当我在打开文件时使用“ios::Ate”时遇到问题
关于如何测量文件大小的几个主题(参见 Using C++ filestreams (fstream), how can you determine the size of a file? 和 C++:
This问题询问 app 和 ate 之间的区别以及答案和 cppreference暗示唯一的区别是 app 意味着写光标在每次写操作之前放在文件的末尾,而 ate 意味着写光标放在仅在打开时文件末尾
我试图将一系列矩阵作为 CSV 附加到磁盘,并发现使用 ios::ate 会覆盖以前创建的任何现有文件。为了通过一个简化的模型来说明这个问题,对下面的函数 write_nums() 的第二次调用会导致
这是来自MSDN的文档:ate,在首次创建控制对象时寻找流的末尾。 trunc,在创建控制对象时删除现有文件的内容。 我只是无法理解它们之间的区别,以下两个代码片段的行为相同(它们在插入之前清除内容)
这个问题在这里已经有了答案: 关闭10年前。 Possible Duplicate: C++ Filehandling: Difference between ios:app and ios:ate?
我正在尝试打开一个文件进行输出并附加到它。附加到它之后,我想将我的输出位置移动到文件中的其他位置并覆盖 现有数据。据我了解,std::ios_base::app 将强制 所有写入到文件的末尾,即 不是
std::ios_base::ate(例如 std::ios_base::app 除外)和 std::的意义何在ios_base::trunc(例如std::ios_base::out除外)? 我应该
ios::ate 和 ios:app 在写入文件时有什么区别。 在我看来,ios::app 使您能够在文件中移动,而使用 ios::ate 它只能在文件末尾读取/写入文件。这是正确的吗? 最佳答案 反
我用 ios::ate 和 ios::out 标志打开我的 fstream,我注意到文件被截断了。如果我还设置了标志 ios::in,则不会出现此问题。然后输出和输入位置就可以了。但我的问题是,如果未
我有以下代码片段: ofile.open("New1.dat",ios::app|ios::binary|ios::ate); long bytes = ofile.tellp()/sizeof(t)
在 windows7 x64 上,我试图修改一个现有的二进制文件,它位于 C: 的根目录中,它是一个 NTFS 文件系统。 以下代码是使用 MSVC Community 2013 (12.0.3110
我有以下令我惊讶的代码(使用 libstdc++4.8)... #include #include #include using namespace std; int main() {
我是一名优秀的程序员,十分优秀!