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++_File_Fstream_Ifstream_Ofstream - Fatal编程技术网

C++ 如何在一次操作中从文件读取/写入固定数量的整数(尽可能快,文件可以假定为二进制)?

C++ 如何在一次操作中从文件读取/写入固定数量的整数(尽可能快,文件可以假定为二进制)?,c++,file,fstream,ifstream,ofstream,C++,File,Fstream,Ifstream,Ofstream,我有一个大文件(假设我可以使它成为二进制文件),它不能在RAM中使用,我想从中对数字进行排序。在这个过程中,我需要快速地从/到文件(从/到vector或int[])读/写大量的数字,所以我不想一个接一个地读/写,而是按固定大小的块读/写。我怎么做 我有一个很大的文件(假设我可以使它成为二进制文件),它不能放入RAM中,我想从中对数字进行排序 鉴于文件是二进制的,也许最简单、大概也是最有效的解决方案是对文件进行内存映射。不幸的是,没有执行内存映射的标准接口。在POSIX系统上,有mmap功能 现在

我有一个大文件(假设我可以使它成为二进制文件),它不能在RAM中使用,我想从中对数字进行排序。在这个过程中,我需要快速地从/到文件(从/到
vector
int[]
)读/写大量的数字,所以我不想一个接一个地读/写,而是按固定大小的块读/写。我怎么做

我有一个很大的文件(假设我可以使它成为二进制文件),它不能放入RAM中,我想从中对数字进行排序

鉴于文件是二进制的,也许最简单、大概也是最有效的解决方案是对文件进行内存映射。不幸的是,没有执行内存映射的标准接口。在POSIX系统上,有
mmap
功能

现在,内存映射文件只是一个原始字节数组。在C++20引入C风格的“隐式创建低级对象”之前,技术上不允许将其视为整数数组。在实践中,这已经适用于大多数当前的语言实现注1

要使此重新解释生效,文件中整数的表示形式必须与CPU使用的整数表示形式相匹配。该文件不能移植到其他不兼容系统上运行的同一程序

我们只需在这个数组上使用
std::sort
。操作系统应该负责在内存中分页文件。然而,
std::sort
使用的算法并不一定针对这个用例进行优化。要找到最佳算法,您可能需要做一些研究

1如果担心C++20之前的标准一致性,可以迭代数组,将底层字节复制到整数中,将新的整数对象放置到内存中,使用复制的整数作为新值。编译器可以将这些操作优化为零指令,这样可以很好地定义程序的行为。

您可以使用它写入文件和读取文件

为了使过程干净,最好在文件中也有项目的数量

假设你有一个
向量

您可以使用以下代码将其内容写入文件

std::vector<int> myData;
// .. Fill up myData;

// Open a file to write to, in binary mode.
std::ofstream out("myData.bin", std::ofstream::binary);

// Write the size first.
auto size = myData.size();
out.write(reinterpret_cast<char const*>(&size), sizeof(size));

// Write the data.
out.write(reinterpret_cast<char const*>(myData.data()), sizeof(int)*size);
std::vector myData;
// .. 填写我的数据;
//以二进制模式打开要写入的文件。
std::ofstreamout(“myData.bin”,std::ofstream::binary);
//先写尺寸。
自动大小=myData.size();
out.write(重新解释铸件和尺寸),sizeof(尺寸));
//写下数据。
out.write(reinterpret_cast(myData.data())、sizeof(int)*size);
您可以使用以下代码读取此类文件的内容

std::vector<int> myData;

// Open the file to read from, in binary mode.
std::ifstream in("myData.bin", std::ifstream::binary);

// Read the size first.
auto size = myData.size();
in.read(reinterpret_cast<char*>(&size), sizeof(size));

// Resize myData so it has enough space to read into.
myData.resize(size);

// Read the data.
in.read(reinterpret_cast<char*>(myData.data()), sizeof(int)*size);
std::vector myData;
//以二进制模式打开要读取的文件。
std::ifstream-in(“myData.bin”,std::ifstream::binary);
//先看尺码。
自动大小=myData.size();
in.read(重新解释铸件和尺寸),sizeof(尺寸));
//调整myData的大小,使其有足够的空间进行读取。
myData.resize(大小);
//读取数据。
in.read(reinterpret_cast(myData.data())、sizeof(int)*size);


如果不是所有的数据都能放入RAM,那么您可以读写更小的数据块。但是,如果您将它们读/写成更小的块,我不知道您将如何对它们进行排序。

如果它是文本文件而不是二进制文件,您别无选择,只能一次执行一个数字,因为每个数字都需要转换。@MarkRansom好的,让我们假设它是二进制的。您看过和吗?@RSahu我实际上不明白如何使用它们。它们读/写字节,对吗?我如何理解,我需要读/写多少字节?如何将字节转换为整数来处理它们?在Linux上使用特定于操作系统的调用,例如POSIX
open()
write()
,速度会更快。如果您需要尽可能快地运行,则不能忽略底层实现。如何将文件分块排序?@eerorika,我没有答案。合并排序。根据定义,使用块对一个或多个文件进行排序。