首页 > 解决方案 > 用 C++ 读/写二进制文件

问题描述

如何使用 C++ 为二进制文件的读写操作创建 linux I/O 基准测试?

我试图用下面的代码生成一个 10MB 的文件,但它返回给我“分段错误(核心转储)”。

#define FILE_SIZE 10240

#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

int main()

{
    int fd, i;
    int stream[FILE_SIZE];
    double span;

    clock_t start,end;

    start=clock();

    fd=open("data.bin", O_CREAT|O_TRUNC|O_WRONLY, S_IRWXU);

    srand(time(NULL));

    for(i=0; i<FILE_SIZE; i++){

        stream[i]=rand()%2;
        write(fd, (char*)stream[i], strlen((char*)stream[i]));

    }

    for(i=0; i<FILE_SIZE; i++)
        read(fd, (char*)stream[i], strlen((char*)stream[i]));

        close(fd);

        end=clock();
        time_lapse=((double)(end-start))/CLOCKS_PER_SEC;

        return 0;
}

然后由于写入和读取功能中包含的转换,它返回了一些警告,我相信有更好的方法来做到这一点。

有人可以帮我吗?

在此先感谢,安东尼奥

标签: c++linuxinputoutputbenchmarking

解决方案


您最大的问题是您将stream[i]其视为字符串!不是一个字符串,它是一个int值。

用于&stream[i]获取指向它的指针,并用于sizeof stream[i]获取其大小。实际上,您不需要单独编写每个元素,您可以一次编写整个数组:

write(fd, stream, sizeof stream);

你也可以这样读。

问题的一个重要标志是您需要使用 C 风格的强制转换。如果您需要在 C++ 中执行此操作,那么这就是您在做您不应该做的事情的歌声。


除此之外,您并没有真正做任何 C++ 特定的事情,您的代码可能是纯 C。

将使用 C++ 解决方案std::fstream

如果您仍然需要使用 POSIX 低级功能,请不要忘记错误检查。您调用的每个函数都可能失败。这实际上包括对close.


推荐阅读