我的主要问题是如何从不属于 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标志。
答案 0 :(得分: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不使用兼容格式,那么您需要找出它使用的格式,并编写一些代码进行转换。
答案 1 :(得分:3)
您需要读取和写入相同的格式。就此而言,您从Matlab编写的是一个未格式化的字节序列,根据您是否使用相同的系统,这些字节可能会也可能无法读取。您可以将这种未格式化的字节序列读入C ++程序(例如使用std::istream::read()
),但不应该考虑存储数据。
要实际存储数据,您需要了解数据的格式。格式可以是二进制或文本,但您应该清楚字节的含义,它们出现的顺序,有多少或如何检测结束,如果值等等。
答案 2 :(得分:1)
使用fwrite
不是最好的主意,因为这会以内部格式写出数据,这可能会也可能不容易在您的程序中回读。
Matlab有其他编写输出的方法,例如:像fprintf这样的功能。更好地以这种方式写出你的数据,那么应该很明显如何将它读回另一个应用程序。
只需使用fprintf(fID, "%f\n", x)
,然后您就可以使用scanf
在C / C ++中阅读此内容。