【问题标题】:Read/write binary file in C++用 C++ 读/写二进制文件
【发布时间】:2018-10-04 10:03:58
【问题描述】:

如何使用 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++,但您显示的代码本质上是 C。

标签: c++ linux input output benchmarking


【解决方案1】:

你最大的问题是你把stream[i]当作一个字符串!不是一个字符串,它是一个int值。

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

write(fd, stream, sizeof stream);

你也可以读它。

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


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

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

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

【讨论】:

    【解决方案2】:

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

    修复:sizeof stream[i]

    【讨论】:

      猜你喜欢
      • 2013-07-10
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      • 2019-09-18
      • 1970-01-01
      • 2020-09-03
      • 2021-06-22
      相关资源
      最近更新 更多