我不确定是否已经与此类似;无论如何,这是我的问题。
我一直在尝试从文件的一部分读取int或float的数据,其内容可以被视为十六进制字节数组(我认为基本上所有的计算机文件都可以)。
例如,我想从.stl文件的第81个字节到第84个字节读取三角形数字的整数;这些特定的十六进制字节可能如下所示:
使用C ++,如何使用最有效的方法执行此操作?我要使用fstream吗?如果是这样,怎么样?
答案 0 :(得分:0)
我会使用POSIX函数(我知道它更像是C解决方案,但它仍然可以在C ++中运行),首先打开文件,然后使用lseek转到第81个字节并读取int(或float):
int fd = open("myfile.stl", O_RDONLY);
if(fd<0){
perror("Opening file");
exit(1);
}
int res = lseek(fd, 0x54, SEEK_SET); //I use 0x54, like in your example
if(res<0){
perror("Lseek-ing file");
exit(1);
}
int buf; //float buf;
res = read(fd, &buf, 4); //I am assuming that on your machine sizeof(int)=4 as you need
if(res!=4){
perror("Reading the value");
exit(1);
}
close(fd);
答案 1 :(得分:0)
除非您使用某些古老或模糊的操作系统,否则无论如何都要对所有文件IO进行缓冲(内存映射)。表现不应该是一个问题。
正确性和便携性应该是。
#include <fstream>
#include <array>
int main(int argc, char** argv)
{
std::ifstream f("data.bin", std::ios::binary);
f.exceptions(std::ios::badbit | std::ios::failbit);
f.seekg(0x54);
std::array<char, 4> buf;
f.read(buf.data(), 4);
// assuming the int in the file is little-endian and 32-bits
std::int32_t my_int =
std::int32_t(buf[0]) & 0xff
+ (std::int32_t(buf[1]) << 8) & 0xff00
+ (std::int32_t(buf[2]) << 16) & 0xff0000
+ (std::int32_t(buf[3]) << 24) & 0xff000000;
return my_int;
}
答案 2 :(得分:0)
工会很容易解决这些问题。
借用奥马尔,我们可以写
int fd = open("myfile.stl", O_RDONLY);
if(fd<0){
perror("Opening file");
exit(1);
}
int res = lseek(fd, 0x54, SEEK_SET); //I use 0x54, like in your example
if(res<0){
perror("Lseek-ing file");
exit(1);
}
union Buffer {
int i;
float f;
} buf;
res = read(fd, &buf, 4); //I am assuming that on your machine sizeof(int)=4 as you need
if(res!=4){
perror("Reading the value");
exit(1);
}
close(fd);
cout << "If it was an integer, it would be " << buf.i << endl
cout << "If it was a float, it would be " << buf.f << endl