【问题标题】:How can I read numbers from a file in C++?如何从 C++ 文件中读取数字?
【发布时间】:2012-11-16 15:36:01
【问题描述】:

我的主要问题是关于如何从不属于 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 标志。

【问题讨论】:

    标签: c++ file matlab fstream


    【解决方案1】:

    使用fwrite 不是最好的主意,因为这会以内部格式写出数据,这在您的程序中可能容易读回,也可能不容易读回。

    Matlab 还有其他写输出的方式,例如fprintf 之类的函数。最好以这种方式写出你的数据,那么如何将它读回另一个应用程序应该是显而易见的。

    只需使用fprintf(fID, "%f\n", x),然后您应该可以使用scanf 在 C/C++ 中读回此内容。

    【讨论】:

    • 感谢您的提示。 (matlab 对 '%f\n' btw 使用单引号)
    • 是的,C/C++ 太多了,而不是 Matlab。它只是看起来好像是 C。
    【解决方案2】:

    使用 &lt;&lt;&gt;&gt; 的格式化 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 需要一个字符指针
    • @user1860611:对不起,我打字的速度比我想象的要快。现在应该可以编译了。
    • 以上适用于浮点数,因为(并非巧合)Matlab 和 C++ 使用标准 IEEE 格式的浮点数。但是,如果 Matlab 在小端机器上运行,而 C++ 程序在大端机器上运行,它可能会在整数上中断。但是,在 C++ 中使用 Matlabs fprintfscanf 应该可以跨机器移植。
    【解决方案3】:

    您需要读取和写入相同的格式。就此而言,您从 Matlab 编写的是一个未格式化的字节序列,取决于您是否使用相同的系统,它可能能够读取,也可能不能够读取。您可能可以将这个未格式化的字节序列读入 C++ 程序(例如使用 std::istream::read()),但您不应该考虑存储数据。

    要实际存储数据,您需要了解数据的格式。格式可以是二进制或文本,但您应该清楚字节的含义、它们出现的顺序、有多少或如何检测值的结尾等。

    【讨论】:

      猜你喜欢
      • 2010-11-22
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多