如何用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;
}
然后它会返回一些由于写和读函数中包含的转换而产生的警告,我相信有更好的方法可以做到这一点。
有人能帮我吗?
提前谢谢你,
安东尼奥
最佳答案
你最大的问题是你把stream[i]
当作一个字符串!它不是字符串,而是一个int
值。
使用&stream[i]
获取指向它的指针,并使用sizeof stream[i]
获取它的大小。实际上,不需要分别编写每个元素,只需一次编写整个数组即可:
write(fd, stream, sizeof stream);
你也可以照着读。
这个问题的一个重要迹象是,您需要使用C风格的转换。如果你需要用C++来做,那么你就应该做一些你不应该做的事情。
除此之外,你还没有做任何C++特定的事情,你的代码可以是普通C。
C++解决方案将使用
std::fstream
代替。如果仍然需要使用POSIX低级函数,请不要忘记错误检查。您调用的每个函数都可能失败。这实际上包括对
close
的调用。关于c++ - 用C++读写二进制文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52643985/