我正在尝试使用Python将整数数组写入二进制文件并在C中读取这些值。我尝试了以下代码,但结果是垃圾。
Python:
import struct
import numpy as np
import matplotlib.pyplot as plt
from functools import reduce
# s = np.random.uniform(0,500,1000)
mu, sigma = 1, 0.1 # mean and standard deviation
n = np.random.normal(mu, sigma, 5000)
n = [i * 1000 for i in n]
n = [int(round(i, 0)) for i in n]
n.sort()
with open('norm.bin', 'wb') as f:
for e in n:
f.write(struct.pack('i', e))
C:
#include <stdio.h>
#define SIZE 5000
int main()
{
FILE *file;
int norm[SIZE];
file = fopen("norm.bin","rb");
fread(norm, sizeof(int), 1, file);
fclose(file);
for (int i = 0; i < SIZE; i++) {
printf("%d\n", norm[i]);
}
return 0;
}
如果有人能帮助我,我将不胜感激。
答案 0 :(得分:0)
fread()
函数的用法是
fread(/*buffer*/, /*size of one element*/, /*number of elements*/, /*file pointer*/);
因此
fread(norm, sizeof(int), 1, file);
仅读取一个元素,而其余4999个元素未初始化。
使用
fread(norm, sizeof(int), SIZE, file);
读取SIZE
元素。
fread()
返回读取的元素数,因此检查读取是否成功
if (fread(norm, sizeof(int), SIZE, file) != SIZE) {
fputs("fread() failed\n", stderr);
fclose(file);
return 1;
}
更好。
答案 1 :(得分:0)
我会在这里对字节序问题保持警惕。
考虑使用Array模块: https://docs.python.org/3/library/array.html
您指定数据格式,但传入本机python类型。然后,它会为您处理转换。与使用struct模块相比,这是处理翻译的一种简便方法。
e.x。
In [18]: a=array('h', [1, 2, 3, 4, 5])
In [19]: a.tostring()
Out[19]: '\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00'
In [20]: a.byteswap()
In [21]: a.tostring()
Out[21]: '\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05'
您还可以使用a.tofile()将bin数据写入文件。注意使用byteswap。如果您的CPU架构字节序不匹配,这是必要的。