Matlab中的`fread(fp, 1, 'int32')`和`fread(fp, n, 'uchar')`分别对应C++中的什么?

3

所以我尝试将这样的Matlab代码转换为C++:

ss = 'file.mask'
fp = fopen(ss, 'rb');
sx = fread(fp,  1, 'int32')
sy = fread(fp,  1, 'int32')
mask = zeros(sy, sx);
mm = mask(100, 100:200);
count = zeros(10, 1); 
for i = 1:sy
    row = fread(fp,  sx, 'uchar');
    for j = 1:sx
        for k = 1:10
            if row(j) == k - 1
                count(k) = count(k) + 1;
            end
        end
    end
    mask(i, :) = row;
end
fclose(fp); 

所以我想知道C++中类似于Matlab的fread函数是什么?

4个回答

2

std::fstream 是C++标准库中访问文件的一种方式,不需要其他库。它提供了operator>>,这可能是你正在寻找的。


1
如果他想以二进制方式读取,那么我认为operator>>并没有太大用处。但我同意他应该使用std::fstream,它还提供了一个read方法。 - Christian Rau
也许 operator>> 不行,但你提到了 read - Griwes

1
如果你真的想要一个C++的类比而不是C的类比(甚至是C/C++的类比),那么你应该使用std::ifstream
std::ifstream in("file.mask", std::ios_base::in | std::ios_base::binary);

int sx, sy;
in.read(reinterpret_cast<char*>(&sx), sizeof(int));
in.read(reinterpret_cast<char*>(&sy), sizeof(int));
std::vector<unsigned char> row(sx);

for(...)
{
    ...
    in.read(reinterpret_cast<char*>(&row[0]), sx);
    ...
}

in.read(reinterpret_cast<char*>(&row[0]), sx); 这行代码会将一个掩码行的所有内容读入到 vector 中吗? - Rella
@Kabumbus 是的,只要 sx 是一行的字节数(而且你不会读取文件末尾或其他错误行为),就可以。实际上,你也可以这样做:if(!in.read(...)) handle error;,但是在你的 MATLAB 代码中也没有这样做。 - Christian Rau

1

std::fstream 是 C++ 中的标准,这是你应该使用的。

然而,freadfclose 是标准的 C 函数,因此也可以在 C++ 中使用。


0

fread在C语言中存在,但在C++中并不常用。然而,如果你想要一个相似的功能,可以按照以下方式操作。

sx=fread(fp,  1, 'int32') is

int sx;
fread(&sx, sizeof(int), 1, fp);

row = fread(fp,  sx, 'uchar'); is

unsigned char row;
fread(&row, sizeof(unsigned char), sx, fp);

如果您需要读取和解析文本表示的数字,可以使用C IO函数中的fscanf。
编辑:
修正了第二个转换中的大小。

在我看来,它比fstream不太方便。 - Griwes
1
考虑到他想要C++的类比,这并不是一个好答案。而且你对第二个函数调用的类比也是错误的,因为他想要读取整行而不仅仅是一个字符。 - Christian Rau
我的报价很实惠,而且 cstdlib 仍然存在。对于 MATLAB 程序员来说,流可能是一个新概念。 - Cem Kalyoncu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接