C++中读/写二进制文件
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]
。
相关文章:
- 如何从二进制文件中读取字符串
- 从二进制文件中读取整数数组
- clang 的 libFuzzer 可以在同一二进制文件中测试超过 1 个 API 吗?
- C++:实际上不是从二进制文件中读取
- 如何从二进制文件中的给定符号中获取调用程序图
- 将内部带有矢量的结构保存/读取到二进制文件中
- 对在不同二进制文件中创建的对象文件的依赖关系
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 计算二进制文件中的位数
- 如何在Qt中使用QDataStream将自定义结构保存/加载到二进制文件中?
- 确认二进制文件中仅存在 1 和 0
- 将对象信息保存到二进制文件中
- 从二进制文件中读取元素时引发异常(引发异常:读取访问冲突. _Pnext 0xB414D4)
- (C++) 使用诅咒打印从文件中读入的新行
- 如果使用非公共类,vtable 是否会在二进制文件中持续存在?
- 如何检查二进制文件中是否存在字符串
- C++:从文本文件中读入
- 无法在二进制文件中存储动态数组
- C++ 从二进制文件中读回"incorrect"值?
- c++中二进制文件中读写数组结构的问题