用C ++读写二进制文件

时间:2018-10-04 10:03:59

标签: c++ linux input output benchmarking

如何为使用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;
}

然后由于写和读函数中包含的转换,它会向我返回一些警告,我敢肯定有更好的方法可以做到这一点。

有人可以帮助我吗?

预先感谢, 安东尼奥

2 个答案:

答案 0 :(得分:1)

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

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

write(fd, stream, sizeof stream);

您可以阅读相同的内容。

该问题的一个重要标志是您需要使用C样式转换。如果您需要用C ++来做,那是您不应该做的事。


除了您实际上并没有做任何特定于C ++的事情外,您的代码也可以是纯C语言。

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

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

答案 1 :(得分:0)

strlen((char*)stream[i])是错误的,因为stream[i]int,而不是char*。因此,strlen将继续读取内存,直到找到一个0字节或耗尽映射的内存为止,然后您会得到SIGSEGV

修复:sizeof stream[i]