作为赋值的一部分,我需要从包含int
,char
数据类型数据的二进制文件中读取数据。该二进制文件分为每个96字节的记录。我试图将这96个字节读入char
缓冲区,然后根据我的信息尝试拆分它们。但是在尝试从缓冲区中获取int
值时,我什么都没得到。你能帮帮我吗?
#include<iostream>
#include<fstream>
#include<cstdio>
using namespace std;
int main()
{
char buffer[100];
char *p;
char temp[10];
int val;
fstream ifs,ofs;
ifs.open("write.bin",ios::binary);
if(ifs.read(buffer,96))
{
cout << "READ" << endl;
}
p = buffer;
memcpy(temp,buffer,4);
cout << temp << endl;
val = atoi(temp);
cout << val << endl;
}
我还使用strncpy
代替memcpy
。
val
的输出为0,temp
的输出为空。
答案 0 :(得分:0)
与C风格的函数不同,read
不返回读取的数字或字节,而是返回istream&
。因此,要检查结果,请在ifs.gcount()
之后致电ifs.read()
。
答案 1 :(得分:0)
atoi
将字符串(char数组)转换为整数。所以类似"42"
的东西会返回整数42
。你的问题的编写方式,听起来像整数只是在文本文件中存储为二进制文件。
指向所需类型的缓冲区指针的简单转换加上取消引用应该:
/* read 96 bytes into char array buffer */
uint32_t your_number = *(uint32_t*)buffer;
cout << your_number << endl;
如果您想使用memcpy
,则无需复制到字符数组,您可以直接复制到整数地址:
uint32_t your_number;
memcpy(&your_number, buffer, 4);
cout << your_number << endl;
使用普通C(不是C ++),这将是:
uint32_t your_number;
FILE *f = fopen("write.bin", "r");
fread(&your_number, sizeof(uint32_t), 1, f); /* uint32's size is 4 bytes */
fclose(f);
printf("%d\n", your_number);
我选择uint32_t
作为数据类型,因为它保证有32位/ 4字节 - int
可能在某些平台/编译器上具有不同的大小。