[英]Read/write binary file in 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;
}
然后,由于写入和读取功能中包含的转换,它会向我返回一些警告,我敢肯定有更好的方法可以做到这一点。
有人可以帮我吗?
预先感谢,安东尼奥
您最大的问题是将stream[i]
视为字符串! 它不是字符串,而是int
值。
使用&stream[i]
获取指向它的指针,并使用sizeof stream[i]
获取其大小。 实际上,您不需要单独编写每个元素,您可以一次编写整个数组:
write(fd, stream, sizeof stream);
您可以阅读相同的内容。
问题的一个明显迹象是,您需要使用C样式转换。 如果您需要用C ++来做,那是您不应该做的一件事。
除此之外,您实际上并没有做任何特定于C ++的事情,您的代码可以是纯C语言。
C ++解决方案将改为使用std::fstream
。
如果您仍然需要使用POSIX低级功能,请不要忘记进行错误检查 。 您调用的每个函数都可能失败。 这实际上包括close
的调用。
strlen((char*)stream[i])
是错误的,因为stream[i]
是int
,而不是char*
。 因此, strlen
会继续读取内存,直到找到0字节或耗尽映射的内存为止,您会得到SIGSEGV
。
修复: sizeof stream[i]
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.