1

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

我想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如果不从缓冲区复制到缓冲区,我怎么能做到这一点intfread获取void指针,所以它不关心缓冲区的类型。

4

3 回答 3

3

fread函数不知道类型,这是正确的。这就是为什么它无法读取原始字节并对其进行转换,它只是将它们按原样放入提供的缓冲区中。如您所知,short在大多数平台上,a 是两个字节,int而是四个。因此,这将行不通,因为fread对此一无所知。

您可以一次读取一个短内容,将其放入int缓冲区,或者读取到一个临时short缓冲区,然后循环并将值逐个复制到int缓冲区中。

于 2012-12-04T20:04:28.460 回答
1

Naja,你必须这样做“从一个短缓冲区复制到一个 int 缓冲区”,因为如果你只是将你的 infile 读入数据,它只会从你的文件中逐字节复制到称为数据的内存中,从而将 2 个短裤写入一个诠释。

于 2012-12-04T20:08:20.920 回答
1

1)如果实际值是文本格式而不是二进制格式,则可以使用fscanfwith并且此方法有效。%hu

unsigned short a
fp = fopen("myfile","r");
while(fscanf(fp,"%hu",&a))
{
    // put a in the array of unsigned short
}

2)如果实际值是二进制格式,您可以使用fscanfwith并且此方法有效。%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
}
于 2012-12-04T20:21:07.977 回答