以本机int格式(而非文本)存储在文件中的fscanf和数字存在问题

以本机int格式(而非文本)存储在文件中的fscanf和数字存在问题,c,C,文件开头的数据(十六进制780000000300497B) 等于int32 120和char 03,后面是其他char数据的加载 由我的另一个程序写入并以十六进制转储模式查看的数据 当我试图用另一个程序读回它时,我已经试过了 int j,padNumber; char rot; j=fscanf(fp,"%d%c",&padNumber,&rot); // insists on returning j=0,padNumber=0 & rot=0 鉴于 char c1

文件开头的数据(十六进制780000000300497B)

等于int32 120和char 03,后面是其他char数据的加载

由我的另一个程序写入并以十六进制转储模式查看的数据

当我试图用另一个程序读回它时,我已经试过了

int j,padNumber;
char rot;

j=fscanf(fp,"%d%c",&padNumber,&rot);  // insists on returning j=0,padNumber=0 & rot=0
鉴于

char c1,c2,c3,c4,rot;

j=fscanf(fp,"&c&c&c&c&c",&c1,%c2,&c3,&c4,&rot);// gives 

j=5,c1='x',c2='\0',c3='\0',c4='\0',rot='!x03'
这相当于我的文件数据


为什么在从本机二进制转储读取时,我不能以本机格式获取int值

使用
fread

fread(&padNumber, sizeof padNumber, 1, fp);
fread(&rot, sizeof rot, 1, fp);
或者,如果您在Unix平台上,直接
read
syscall也可以工作

#include <unistd.h>
...
read(fd, &padNumber, sizeof padNumber);
read(fd, &rot, sizeof rot);
#包括
...
读取(fd和焊盘编号、焊盘编号尺寸);
读取(fd和rot、rot大小);

从本机二进制转储读取时使用
fread

fread(&padNumber, sizeof padNumber, 1, fp);
fread(&rot, sizeof rot, 1, fp);
或者,如果您在Unix平台上,直接
read
syscall也可以工作

#include <unistd.h>
...
read(fd, &padNumber, sizeof padNumber);
read(fd, &rot, sizeof rot);
#包括
...
读取(fd和焊盘编号、焊盘编号尺寸);
读取(fd和rot、rot大小);

从本机二进制转储读取时使用
fread

fread(&padNumber, sizeof padNumber, 1, fp);
fread(&rot, sizeof rot, 1, fp);
或者,如果您在Unix平台上,直接
read
syscall也可以工作

#include <unistd.h>
...
read(fd, &padNumber, sizeof padNumber);
read(fd, &rot, sizeof rot);
#包括
...
读取(fd和焊盘编号、焊盘编号尺寸);
读取(fd和rot、rot大小);

从本机二进制转储读取时使用
fread

fread(&padNumber, sizeof padNumber, 1, fp);
fread(&rot, sizeof rot, 1, fp);
或者,如果您在Unix平台上,直接
read
syscall也可以工作

#include <unistd.h>
...
read(fd, &padNumber, sizeof padNumber);
read(fd, &rot, sizeof rot);
#包括
...
读取(fd和焊盘编号、焊盘编号尺寸);
读取(fd和rot、rot大小);


您确实意识到
fscanf()
将依赖平台的文本解析为本机类型,对吗?不是原始字节;文本。所以要回答这个问题,因为你使用的函数并不像你想象的那样。如果数据存储在二进制文件中,你就不能使用文本函数来读取它们。阅读有关函数的信息。记住也要以二进制模式打开文件。使用binmode使用
fread
。因为这是文件中的字符,所以您需要读取字符串,然后将其转换为数字,例如,如@MikeMinaev此处所述,数据不是存储为字符字符串,而是存储为字节序列,可能是在二进制模式下使用文件上的
fwrite()
等效项编写的。文本翻译与此无关(事实上,它所做的假设与OP的问题直接相关)。您确实意识到
fscanf()
将依赖平台的文本解析为本机类型,对吗?不是原始字节;文本。所以要回答这个问题,因为你使用的函数并不像你想象的那样。如果数据存储在二进制文件中,你就不能使用文本函数来读取它们。阅读有关函数的信息。记住也要以二进制模式打开文件。使用binmode使用
fread
。因为这是文件中的字符,所以您需要读取字符串,然后将其转换为数字,例如,如@MikeMinaev此处所述,数据不是存储为字符字符串,而是存储为字节序列,可能是在二进制模式下使用文件上的
fwrite()
等效项编写的。文本翻译与此无关(事实上,它所做的假设与OP的问题直接相关)。您确实意识到
fscanf()
将依赖平台的文本解析为本机类型,对吗?不是原始字节;文本。所以要回答这个问题,因为你使用的函数并不像你想象的那样。如果数据存储在二进制文件中,你就不能使用文本函数来读取它们。阅读有关函数的信息。记住也要以二进制模式打开文件。使用binmode使用
fread
。因为这是文件中的字符,所以您需要读取字符串,然后将其转换为数字,例如,如@MikeMinaev此处所述,数据不是存储为字符字符串,而是存储为字节序列,可能是在二进制模式下使用文件上的
fwrite()
等效项编写的。文本翻译与此无关(事实上,它所做的假设与OP的问题直接相关)。您确实意识到
fscanf()
将依赖平台的文本解析为本机类型,对吗?不是原始字节;文本。所以要回答这个问题,因为你使用的函数并不像你想象的那样。如果数据存储在二进制文件中,你就不能使用文本函数来读取它们。阅读有关函数的信息。记住也要以二进制模式打开文件。使用binmode使用
fread
。因为这是文件中的字符,所以您需要读取字符串,然后将其转换为数字,例如,如@MikeMinaev此处所述,数据不是存储为字符字符串,而是存储为字节序列,可能是在二进制模式下使用文件上的
fwrite()
等效项编写的。文本翻译与此无关(事实上,它所做的假设与OP的问题直接相关)。请注意,只有当此数据的编写者使用相同的
int
数据类型的位宽和相同的endian格式时,这才起作用。一个64位
int
系统(不管endian格式如何),同时阻塞在该系统上。同样,一个大端32位平台。强烈建议使用
和已知宽度的数据类型(例如:
int32\t
),如果提供,并且如果读卡器的endian格式不匹配,则需要字节移位汇编(如果可移植性是最终目标,则无论如何都应该这样做)。这就是为什么任何理智的人都会避免数据存储的二进制转储。请注意,只有当此数据的写入者使用相同的
int
数据类型位宽度和相同的endian格式时,这才有效。一个64位
int
系统(不管endian格式如何),同时阻塞在该系统上。同样,一个大端32位平台。强烈建议使用
和已知宽度的数据类型(例如:
int32\t
),如果提供,并且如果读卡器的endian格式不匹配,则需要字节移位汇编(如果可移植性是最终目标,则无论如何都应该这样做)。这就是为什么