C/C++或大文件操作,用什么方法最快

问题遇到的现象和发生背景

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 系统都使用对应的函数解除文件映射并关闭文件句柄。
望采纳!