C++ /C大文件读入、写出、用什么方法最快,写出文件为1G5G,读取文件也是1G5G,同时支持Windows和Linux
0 Copy吗?
在 C/C++ 中,用 fread 和 fwrite 函数读写大文件是最快的方法。它们采用了缓存机制,能够最大限度地减少系统调用次数。在读写大文件时,应该每次读写大量数据,而不是一次读写一个字节。在 Windows 和 Linux 平台上都支持 fread 和 fwrite 函数。
如果文件较大,需要使用操作系统提供的内存映射文件 (memory-mapped file) 技术,即 mmap 在 Linux 和 CreateFileMapping/MapViewOfFile 在 Windows。使用这种方法可以把文件映射到进程的虚拟内存中,直接访问文件内容。
采用0 Copy 方式读写大文件,指的是避免使用操作系统提供的文件拷贝机制来实现读写操作,在Linux中可以使用sendfile()实现0 Copy, 在Windows中可以使用TransmitFile()函数实现.
望采纳!!!点击回答右侧采纳即可!!
使用 C++ 的 fstream 类进行文件读写是一种非常快速的方法。在读写文件时,使用 fstream 类的 read() 和 write() 方法将提高读写速度。下面是一个例子来读写一个1G大小的文件。
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
// 文件读写
fstream file("largefile.dat", ios::in | ios::out | ios::binary);
if (!file.is_open())
{
cout << "Error opening file" << endl;
return 1;
}
// 读取文件
char* buffer = new char[1024*1024*1024]; // 1GB 的缓冲区
file.read(buffer, 1024*1024*1024);
// 写入文件
file.write(buffer, 1024*1024*1024);
// 关闭文件
file.close();
delete[] buffer;
return 0;
}
在 C++ 中,使用 fread 和 fwrite 函数来读写大文件是最快的方法之一。这些函数是 C 标准库中的函数,在 Windows 和 Linux 上都可以使用。它们可以一次读写一个块的数据,而不是一个字符一个字符地读写,大大提高了读写速度。
fread 函数格式如下:
size_t fread (void* buffer, size_t size, size_t count, FILE* stream);
参数说明:
buffer:用来存放读取到的数据的缓存区
size:每个元素的大小(字节数)
count:要读取的元素个数
stream:文件指针
fwrite函数格式如下:
size_t fwrite (const void* buffer, size_t size, size_t count, FILE* stream);
参数说明:
buffer:待写入的数据的缓存区
size:每个元素的大小(字节数)
count:要写入的元素个数
stream:文件指针
设置缓存大小(比如设为4MB),进行多次读写可以更快的读写文件。
如果文件太大时而需要进行复制,建议使用操作系统自带的复制命令来复制文件,如 Windows 上的 xcopy 或 Linux 上的 cp。
下面是使用 fread 和 fwrite 读写大文件的示例代码:
#include <cstdio>
int main() {
// 设置缓存大小
const int buffer_size = 4 * 1024 * 1024; // 4MB
char* buffer = new char[buffer_size];
// 打开文件
FILE* source_file = fopen("source.bin", "rb");
FILE* dest_file = fopen("dest.bin", "wb");
// 读取文件
while (!feof(source_file)) {
size_t read_size = fread(buffer, 1, buffer_size, source_file);
fwrite(buffer, 1, read_size, dest_file);
}
// 关闭文件
fclose(source_file);
fclose(dest_file);
// 释放内存
delete[] buffer;
return 0;
}
从 source.bin 文件中读取数据并将其写入 dest.bin 文件中。代码中定义了一个 4MB 的缓存,每次读取 4MB 的数据并写入目标文件。
在使用 fread 和 fwrite 读写文件时,文件必须先用 fopen 打开,最后用 fclose 关闭。
fread函数和fwrite函数,或者fstream 类的 read() 和 write() 方法的速度受每次操作的内存大小影响。每次操作几个字节的效率是很低的,如果一次读写几k或几M,速度会有明显提升。
我觉得不在于用什么库操作文件,还是要看你具体做大文件的什么操作,可以把代码贴出来,其中慢的瓶颈在哪里,针对性优化。
对文件格式化读写函数 fprintf 与 fscanf 而言,尽管它可以从磁盘文件中读写任何类型的文件,即读写的文件类型可以是文本文件、二进制文件,也可以是其他形式的文件。但是,对二进制文件的读写来说,考虑到文件的读写效率等原因,还是建议尽量使用 fread 和 fwrite 函数进行读写操作。
fread 与 fwrite 函数的原型如下面的代码所示:
size_t fread(void *buf, size_t size, size_t count, FILE *fp);
size_t fwrite(const void * buf, size_t size, size_t count, FILE *fp);
必须使用mmap啊,直接内存操作,速度上没问题
在 C++/C 中读写大文件最快的方法之一是使用 mmap 函数。这个函数允许您将文件映射到内存中,从而允许您使用指针进行高效读写。在 Windows 上,您可以使用 CreateFileMapping 和 MapViewOfFile 函数来实现 mmap 函数的功能。在 Linux 上,您可以使用 mmap 函数。
需要注意的是,mmap 函数可能需要一些额外的内存来存储映射的文件,因此如果内存空间有限,可能需要使用其他方法。
另一种方法是使用 C++ 的 fstream 库,其中包含了 fread 和 fwrite 函数,可以指定读写的字节数,在读写大文件时非常有效。
对于1G5G的文件来说,使用C++中的fstream库会比较快。
需要注意的是,在读写大文件时需要注意的是,在读写大文件时,应该尽量避免使用标准输入输出流,因为它们会缓慢很多。应该考虑使用 fread 和 fwrite 函数,或者使用文件指针进行读写。
还有一个高效的方法是使用 C++ 的 async IO 库,它可以使用多线程读写文件,进一步提高读写速度。
总之,在读写大文件时,应该避免使用标准输入输出流,使用高效的函数和库,并尽量使用多线程进行读写。
在 C++ 中,读写大文件最快的方法是使用 C 标准库中的文件操作函数,如 fread() 和 fwrite()。这些函数可以一次读写一块缓冲区,而不是一个字符一个字符地进行操作。
举个例子,下面的代码可以快速读取一个文件:
#include <cstdio>
int main() {
const int BUFSIZE = 8192;
char buffer[BUFSIZE];
FILE* fp = fopen("largefile.txt", "rb");
if (fp == nullptr) {
// error handling
}
while (size_t bytes_read = fread(buffer, 1, BUFSIZE, fp)) {
// process the buffer
}
fclose(fp);
return 0;
}
同样的,下面的代码可以快速写入一个文件:
#include <cstdio>
int main() {
const int BUFSIZE = 8192;
char buffer[BUFSIZE];
FILE* fp = fopen("largefile.txt", "wb");
if (fp == nullptr) {
// error handling
}
while (/* fill the buffer */) {
size_t bytes_written = fwrite(buffer, 1, BUFSIZE, fp);
// check for errors
}
fclose(fp);
return 0;
}
这样做可以大幅提高文件读写的性能,因为它避免了系统调用的开销。
另外,在 Windows 和 Linux 系统上的文件读写方法是一样的,所以不需要针对不同平台进行特殊处理。
对于文件复制,可以使用fread和fwrite来实现,或者使用boost库的文件复制函数 boost::filesystem::copy_file(),在大文件复制时可以大幅提高性能。
C++的 fstream 方法读取1G文件比较快
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
// 文件读写
fstream file("largefile.dat", ios::in | ios::out | ios::binary);
if (!file.is_open())
{
cout << "Error opening file" << endl;
return 1;
}
// 读取文件
char* buffer = new char[1024*1024*1024]; // 1GB 的缓冲区
file.read(buffer, 1024*1024*1024);
// 写入文件
file.write(buffer, 1024*1024*1024);
// 关闭文件
file.close();
delete[] buffer;
return 0;
}
读写巨大文件的最快方法是使用 mmap() 函数。mmap() 函数可以将文件映射到进程的虚拟内存空间,这样就可以直接对文件进行读写操作,而不用拷贝数据。
在 Windows 上,可以使用 CreateFileMapping() 和 MapViewOfFile() 函数来实现 mmap() 的功能。
下面是一个示例代码,实现了在 Windows 和 Linux 上读取文件的功能:
#include <iostream> // 标准输入输出流库
#include <string> // 字符串库
#ifdef _WIN32 // 如果是 Windows 系统
#include <windows.h> // Windows API头文件
#else // 如果是 Linux 系统
#include <sys/mman.h> // mmap 函数库
#include <unistd.h> // close 函数库
#include <fcntl.h> // open 函数库
#endif
int main(int argc, char* argv[]) {
if (argc < 2) { // 如果没有输入文件名
std::cout << "Usage: " << argv[0] << " <file>" << std::endl; // 提示使用方法
return 1; // 程序结束
}
std::string file_name = argv[1]; // 获取文件名
#ifdef _WIN32 // 如果是 Windows 系统
HANDLE file_handle = CreateFile(file_name.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
// 使用 CreateFile 函数打开文件,获取文件句柄
if (file_handle == INVALID_HANDLE_VALUE) { // 如果打开失败
std::cout << "CreateFile failed: " << GetLastError() << std::endl; // 打印错误信息
return 1; // 程序结束
}
HANDLE mapping_handle = CreateFileMapping(file_handle, NULL, PAGE_READONLY, 0, 0, NULL);
// 使用 CreateFileMapping 函数创建文件映射对象,获取文件映射句柄
if (mapping_handle == NULL) { // 如果创建失败
std::cout << "CreateFileMapping failed: " << GetLastError() << std::endl; // 打印错误信息
CloseHandle(file_handle); // 关闭文件句柄
return 1; // 程序结束
}
LPVOID data = MapViewOfFile(mapping_handle, FILE_MAP_READ, 0, 0, 0);
// 使用 MapViewOfFile 函数将文件映射
if (data == NULL) { // 如果映射失败
std::cout << "MapViewOfFile failed: " << GetLastError() << std::endl; // 打印错误信息
CloseHandle(mapping_handle); // 关闭文件映射句柄
CloseHandle(file_handle); // 关闭文件句柄
return 1; // 程序结束
}
#else
int file_handle = open(file_name.c_str(), O_RDONLY); // 使用 open 函数打开文件
if (file_handle == -1) { // 如果打开失败
std::cout << "open failed" << std::endl; // 打印错误信息
return 1; // 程序结束
}
struct stat sb;
if (fstat(file_handle, &sb) == -1) { // 获取文件大小
std::cout << "fstat failed" << std::endl; // 如果获取失败
close(file_handle); // 关闭文件句柄
return 1; // 程序结束
}
size_t size = sb.st_size;
void* data = mmap(NULL, size, PROT_READ, MAP_PRIVATE, file_handle, 0); // 使用 mmap 函数将文件映射到进程的虚拟内存空间
if (data == MAP_FAILED) { // 如果映射失败
std::cout << "mmap failed" << std::endl; // 打印错误信息
close(file_handle); // 关闭文件句柄
return 1; // 程序结束
}
#endif
// Do something with the file data
std::cout << "File data: " << std::string((char*)data, size) << std::endl;
// 将文件内容输出到控制台
#ifdef _WIN32
UnmapViewOfFile(data); // 使用 UnmapViewOfFile 函数解除文件映射
CloseHandle(mapping_handle); // 关闭文件映射句柄
CloseHandle(file_handle); // 关闭文件句柄
#else
munmap(data, size); // 使用 munmap 函数解除文件映射
close(file_handle); // 关闭文件句柄
#endif
return 0; // 程序正常结束
}
这段代码中,在 Windows 中使用 CreateFile()、CreateFileMapping() 和 MapViewOfFile() 函数将文件映射到进程的虚拟内存空间中,而在 Linux 中使用 open()、mmap()、fstat() 函数将文件映射到进程的虚拟内存空间中。最后,无论是 Windows 还是 Linux 系统都使用对应的函数解除文件映射并关闭文件句柄。
望采纳!