我想读取另一个程序提供的32位整数二进制文件。该文件仅包含整数,不包含其他字符(如空格或逗号)。读取此文件的C代码如下:
FILE* pf = fopen("C:/rktemp/filename.dat", "r");
int sz = width*height;
int* vals = new int[sz];
int elread = fread((char*)vals, sizeof(int), sz, pf);
for( int j = 0; j < height; j++ )
{
for( int k = 0; k < width; k++ )
{
int i = j*width+k;
labels[i] = vals[i];
}
}
delete [] vals;
fclose(pf);
但我不知道如何使用Lua将此文件读入数组。
我尝试使用io.read
读取此文件,但部分数组如下所示:
~~~~~~ xxxxxxxxyyyyyyyyyyyyyyzzzzzzzz {{{{{{{{{|||||||||}}}}}}}}}}} ~~~~~~~~~ xxxxxxxyyyyyyyyyyyyyyzzzzzz { {{{{{{{{{|||||||||}}}}}}}}}}} ~~~~~~~~~ xxyyyyyyyyyyyyyzzzzz {{{{{{|||}} } yyyyyyyyyyyz {{{yyyyyyyyÞľūơǿȵɶʢ˺̤̼ͽаҩӱľǿجٴȵɶʢܷݸ˺⼼ӱľǿ
读取此文件的Matlab代码也是这样的:
row = image_size(1);
colomn = image_size(2);
fid = fopen(data_path,'r');
A = fread(fid, row * colomn, 'uint32')';
A = A + 1;
B = reshape(A,[colomn, row]);
B = B';
fclose(fid);
我尝试过将字节转换为整数的函数,我的代码是这样的:
function bytes_to_int(b1, b2, b3, b4)
if not b4 then error("need four bytes to convert to int",2) end
local n = b1 + b2*256 + b3*65536 + b4*16777216
n = (n > 2147483647) and (n - 4294967296) or n
return n
end
local sup_filename = '1.dat'
fid = io.open(sup_filename, "r")
st = bytes_to_int(fid:read("*all"):byte(1,4))
print(st)
fid:close()
但它仍然无法正确读取此文件。
答案 0 :(得分:2)
您只需拨打bytes_to_int
一次。您需要为要阅读的每个int
调用它。 e.g。
fid = io.open(sup_filename, "rb")
while true do
local bytes = fid:read(4)
if bytes == nil then break end -- EOF
local st = bytes_to_int(bytes:byte(1,4))
print(st)
end
fid:close()