这可能已经讨论过,但我找不到任何相关主题。
我想从文件中读取short
值,并使用int
将它们存储在fread
值的缓冲区中。所以基本上我想这样做:
int *data; //int buffer
data = (int *) malloc(1000 * sizeof(int));
fread(data, sizeof(short), 1000, infile); //infile is organized in 2-byte chunks
数据以2字节块(short
)存储在文件中。但是当我读取这些数据时,我想将它们放入int
缓冲区。如果不从short
缓冲区复制到int
缓冲区,我怎么能这样做? fread
获取void
指针,因此它不关心缓冲区的类型。
答案 0 :(得分:3)
fread
函数不知道类型,这是正确的。这就是为什么它无法读取原始字节并转换它们,它只是将它们原样放入提供的缓冲区中。如您所知,大多数平台上的short
是两个字节,而int
是四个。因此fread
无法理解这一点,因此无效。
您可以一次读取一个短文,将其放入int
缓冲区,或者读入临时short
缓冲区,然后循环并按值复制值到int
缓冲区。
答案 1 :(得分:1)
Naja,你必须这样做“从一个短缓冲区复制到一个int缓冲区”,因为如果你只是将你的infile读入数据,它只会从你的文件中逐字节地复制到称为数据的内存中,从而写入2短缺成一个int。
答案 2 :(得分:1)
1)您可以将fscanf
与%hu
一起使用,如果实际值是文本格式而非二进制格式,则此方法有效。
unsigned short a
fp = fopen("myfile","r");
while(fscanf(fp,"%hu",&a))
{
// put a in the array of unsigned short
}
2)您可以将fscanf
与%c
一起使用,如果实际值是二进制格式,则此方法有效。
unsigned short a;
char b,c;
fp = fopen("myfile","r");
while(fscanf(fp,"%c",&b) && fscanf(fp,"%c",&c))
{
a = (unsigned short) b;
a = a << 8;
a+= (unsigned short) c;
// put a in the array of unsigned short
}