C 从文件中读取N个字节,然后转换为整数的首选方法
我正在尝试编写一个简单的磁盘访问函数,如下所示,但无法决定什么是合适的;将缓冲区强制转换为数据类型或逐字节执行一些逐位操作。在未来,我打算让它更加持久友好,那么选择什么呢?有什么明显的原因让他们中的一个更受欢迎吗C 从文件中读取N个字节,然后转换为整数的首选方法,c,file,fread,C,File,Fread,我正在尝试编写一个简单的磁盘访问函数,如下所示,但无法决定什么是合适的;将缓冲区强制转换为数据类型或逐字节执行一些逐位操作。在未来,我打算让它更加持久友好,那么选择什么呢?有什么明显的原因让他们中的一个更受欢迎吗 #包括 ... uint16文件读取int8(文件*fp){ 字符缓冲区[2]; fread(缓冲区,1,2,文件); //这个? 返回*((uint16_t*)缓冲区); //还是这个? 返回缓冲区[0]|(缓冲区[1]两者都可以工作。第一个选项假设读写文件使用了相同的体系结构(bi
#包括
...
uint16文件读取int8(文件*fp){
字符缓冲区[2];
fread(缓冲区,1,2,文件);
//这个?
返回*((uint16_t*)缓冲区);
//还是这个?
返回缓冲区[0]|(缓冲区[1]两者都可以工作。第一个选项假设读写文件使用了相同的体系结构(big-endian vs.little-endian)。第二个选项没有这样的假设——它采用little-endian(英特尔)格式。第一个选项可能更快,具体取决于优化器的性能(或性能)。我认为第二种格式更可取,因为它可以在任何体系结构上工作,因此允许文件格式为“跨平台”--这意味着任何一种体系结构都可以创建该文件,并且任何一种体系结构都可以读取该文件。谢谢。那么你是说无论cpu的体系结构如何,强制转换都可以工作吗?请不要忽略前面的评论;)我也更喜欢第二种方法,因为它可以操作字节。所以使用字节是最安全的方法,谢谢。这两种方法都不会正确工作。而是使用类似char buffer[3]={0}'…返回atoi(buffer);
#include <pstdint.h>
...
uint16_t file_read_int8(FILE* fp) {
char buffer[2];
fread(buffer,1,2,file);
// this?
return *((uint16_t *)buffer);
// or this?
return buffer[0] | (buffer[1]<<8);
}