Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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 在块中读取2字节长的整数_C_Arrays_File_Io_Fread - Fatal编程技术网

C 在块中读取2字节长的整数

C 在块中读取2字节长的整数,c,arrays,file,io,fread,C,Arrays,File,Io,Fread,我正在将一个满是2字节长整数的文件读取到一个数组中 FILE *f = fopen("file.bin", "rb"); int *arr; int len = 2; 这项工作: // method 1 for (int i = 0; i < numberOfElements; i++) fread(arr + i, len, 1, f); 目标是提高性能。如果要读取一组2字节整数,则需要将它们读入一个2字节整数数组。最直接的方法是使用标准类型int16\t from。你会想

我正在将一个满是2字节长整数的文件读取到一个数组中

FILE *f = fopen("file.bin", "rb");
int *arr;
int len = 2;
这项工作:

// method 1
for (int i = 0; i < numberOfElements; i++)
     fread(arr + i, len, 1, f);

目标是提高性能。

如果要读取一组2字节整数,则需要将它们读入一个2字节整数数组。最直接的方法是使用标准类型int16\t from。你会想要这样的东西:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <assert.h>

FILE *f = fopen("file.bin", "rb");
int16_t *arr;
int len = 2;

assert(sizeof(*arr) == len);

arr = malloc(numberOfElements * len);

if(arr == NULL) {
    fprintf(stderr, "malloc failed\n");
    exit(1);
}

int r = fread(arr, len, numberOfElements, f);

if(r != numberOfElements) {
    fprintf(stderr, "incorrect number of items read\n");
    exit(1);
}

您会注意到,我添加了分配arr的代码,检查malloc是否成功,检查我们选择的类型是否与len匹配,并检查fread是否确实读取了预期的项数。

使用int16\t或short。好的,但实际上我需要数组具有ints 32位。此外,我可能正在从文件中读取不同长度的整数。@AsoneTuhid对我来说,这是有效的二进制I/O的基本问题。如果希望能够读取大数据块,内存中的数据结构必须与外部表示完全匹配。例如,如果你不能使它们匹配,如果它们有不同的大小,正如你所说,你别无选择,只能逐个元素地读取并可能进行一些转换。@AsoneTuhid同样,尽管我没有提到,但我认为你的方法1在开始读取之前假设*arr的所有字节都是0。否则,如果*arr中的int是,比如说,4个字节,而您只读取2个字节,那么每个int的另外两个字节将是垃圾。另外,你可能知道,还有字节顺序的问题。是的,我已经处理过了,谢谢。因此,没有任何偷偷摸摸的方法将一个块读入内存并以某种方式对其进行分区?@AsoneTuhid我所知道的唯一接近的是readv系统调用,我认为它不打算也不可能实际用于类似的事情。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <assert.h>

FILE *f = fopen("file.bin", "rb");
int16_t *arr;
int len = 2;

assert(sizeof(*arr) == len);

arr = malloc(numberOfElements * len);

if(arr == NULL) {
    fprintf(stderr, "malloc failed\n");
    exit(1);
}

int r = fread(arr, len, numberOfElements, f);

if(r != numberOfElements) {
    fprintf(stderr, "incorrect number of items read\n");
    exit(1);
}