Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将数据写入>;带C++;?_C++_File - Fatal编程技术网

C++ 如何将数据写入>;带C++;?

C++ 如何将数据写入>;带C++;?,c++,file,C++,File,我正试图写一个大文件,但遇到了一个问题 我使用long long来寻找一个写的地方,但不能写超过4,2Gb的文件。我忘了什么 更多详情: 我打开4Gb文件: ifstream ifs(db_name.c_str(), ios_base::binary); if (!ifs) throw Bad_archive(); ifs.read(as_bytes(seg_size), sizeof(int)); ifs.read(as_bytes(last_idx), sizeof(int));

我正试图写一个大文件,但遇到了一个问题

我使用long long来寻找一个写的地方,但不能写超过4,2Gb的文件。我忘了什么

更多详情: 我打开4Gb文件:

ifstream ifs(db_name.c_str(), ios_base::binary);
if (!ifs) 
    throw Bad_archive();
ifs.read(as_bytes(seg_size), sizeof(int));
ifs.read(as_bytes(last_idx), sizeof(int));
ifs.read(as_bytes(free_segs), sizeof(int));
if (free_segs > 0)
{
    long long seek_g = 3 * sizeof(int) + (long long)last_idx * seg_size;
    ifs.seekg(seek_g, ios_base::beg);
    for (int i = 0; i < free_segs; i++)
    {
        int tmp = 0;
        ifs.read(as_bytes(tmp), sizeof(int));
        free_spaces.push_back(tmp);
    }
}
ifs.close();
但这个代码是有效的:

ofstream ofs2("huge2");
ofs2.close();
ofstream ofs("huge2", ios_base::in | ios_base::ate);
long long sp = 10000000000;
ofs.seekp(10000000000, ios_base::beg);

ofs.write(as_bytes(sp), sizeof(sp));

ofs.close();

许多不支持大于4GB的文件。另外,您应该考虑您的<代码> int <代码>类型可能有一个范围,在<代码> 2 ^ 32 < /> >,即4.29 497 e+1 .< /p> 上有一个名为yLISKi64()的函数,在Win32上,并且在*NIX上有LSEK64()。然而,iostream库并没有直接包装它们,您必须以某种方式检索文件描述符,并采取一些缓冲措施

    fseeko64 (Filename, 0, SEEK_END);
    long size = ftello64 (Filename);
    fclose (Filename);

对于访问大文件,不能使用fseek,而必须使用fseeko64()

这里有一个很好的Linux摘要:

还有RedHat针对RHEL的更具体的细节,这些问题通常适用于访问64位大小文件的32位应用程序


<>维基百科实际上有一个OrdLon,但实际上并不是那么有用。

你总是可以在一个循环中寻找并前进到你想要的位置,但是很难跟踪不对齐的偏移量。许多C++流的实现都被困在上个世纪。当4G字节对每个人都足够的时候。更新char_traits::pos_type以使用64个手指计数并不容易,这会破坏现有代码。关于int的投票结果很明显。我有NTFS。2.我知道int。我用long-long来表示变量,在这种情况下可能会被过度填充。但这并不是一个真正的解释。c标准要求类型的宽度至少为8字节,以便它们可以使用其中一个来添加函数。还有一些文件系统不允许超过32MB的大小,所以现在已经存在值太大的问题了。@Voo:是的,当然这个问题一直存在,除非有一些我不知道的历史文件系统曾经允许无限大小的文件。实际上,如果他已经在使用特定于平台的代码,他可以在Windows下使用具有重叠结构的
(Write | Read)文件
。它支持8字节的偏移量,但一次只能写入4gb。我假设POSIX中定义了一些类似的舒适函数。
ofstream ofs2("huge2");
ofs2.close();
ofstream ofs("huge2", ios_base::in | ios_base::ate);
long long sp = 10000000000;
ofs.seekp(10000000000, ios_base::beg);

ofs.write(as_bytes(sp), sizeof(sp));

ofs.close();
    fseeko64 (Filename, 0, SEEK_END);
    long size = ftello64 (Filename);
    fclose (Filename);