如何在C++中从文件中读取数字?

4

我的主要问题是如何读取不是char数据类型的文件中的数据。我将从MATLAB写入数据文件,如下所示:

x=rand(1,60000);
fID=fopen('Data.txt','w');
fwrite(fID,x,'float');
fclose(fID);

当我尝试使用以下代码在C++中读取时,“num”并没有改变。
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    fstream fin("Data.txt",ios::in | ios::binary);
    if (!fin)
    {   
        cout<<"\n Couldn't find file \n";
        return 0;
    }
    float num=123;
    float loopSize=100e3;
    for(int i=0; i<loopSize; i++)
    {
        if(fin.eof())
        break;

        fin >> num;
        cout<< num;
    }
    fin.close();
    return 0;
}

我能够很好地在Matlab中读写文件,在C++中也能读写文件,但我无法在Matlab中写入并在C++中读取。我在Matlab中写的文件格式是我想要的,但是在C++中写入/读出的数字似乎以文本形式呈现。请问如何在C++中从文件中读取一系列浮点数,或者我做错了什么?
编辑:循环代码有些混乱,因为我不想让它无限循环,eof标志永远没有被设置。
3个回答

6

使用<<>>进行格式化的I/O确实可以将数字值读取和写入文本。

假定Matlab是以二进制格式编写浮点数值的。如果它使用与C++相同的格式(大多数实现使用标准IEEE二进制格式),那么您可以使用不带格式的输入读取字节,并根据以下方式重新解释它们为浮点值:

float f;  // Might need to be "double", depending on format
fin.read(reinterpret_cast<char*>(&f), sizeof f);

如果Matlab不使用兼容格式,则需要找出它使用的格式并编写一些代码进行转换。


编译器报错是因为fin.read期望一个char指针。 - user1860611
@user1860611:抱歉,我打字的速度比思考的速度快了。现在应该可以编译了。 - Mike Seymour
1
以上适用于浮点数,因为(不是巧合的)Matlab和C++使用标准IEEE格式浮点数。然而,如果Matlab在小端机器上运行,而C++程序在大端机器上运行,则可能会在整数上出现错误。但是,在C++中使用Matlabs的fprintfscanf应该可以跨机器移植。 - Zane

3
你需要读写相同的格式。因此,从Matlab编写的内容是未经格式化的字节序列,具体取决于您是否使用相同的系统,可能无法读取。您可以使用C++程序(例如使用std::istream::read())读取这个未格式化的字节序列,但不应将数据视为已存储。
要实际存储数据,您需要了解数据的格式。格式可以是二进制或文本,但您应该清楚字节的含义,它们出现的顺序,有多少个字节,如何检测值的结束等。

1

使用fwrite不是最好的选择,因为它会以内部格式写出数据,这可能很难读回到您的程序中。

Matlab有其他的输出方式,例如像fprintf这样的函数。最好用这种方式写出您的数据,那么如何将其读回另一个应用程序就很明显了。

只需使用fprintf(fID, "%f\n", x),然后您就可以使用scanf在C/C++中将其读回。


谢谢你的提示。(顺便说一下,Matlab在'%f\n'中使用单引号) - user1860611
太多的C/C++,不太用Matlab。它看起来只是C。 - Zane

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