使用文件中的短值并将其存储到int缓冲区中

时间:2012-12-04 19:59:26

标签: c types

这可能已经讨论过,但我找不到任何相关主题。

我想从文件中读取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指针,因此它不关心缓冲区的类型。

3 个答案:

答案 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
}