Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从文件中读取N个字节,然后转换为整数的首选方法_C_File_Fread - Fatal编程技术网

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);
}