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 ++のファイルから一連のfloatをどのように読み取りますか、または何が間違っていますか?

編集:無限ループが必要でなく、eofフラグが設定されていなかったため、ループコードが乱雑になっています。

4

3 に答える 3

6

<<andを使用した書式付き I/O>>は、実際に数値をテキストとして読み書きします。

おそらく、Matlab は浮動小数点値をバイナリ形式で書き込んでいます。C++ と同じ形式を使用する場合 (ほとんどの実装では標準の IEEE バイナリ形式が使用されます)、次の行に従って、フォーマットされていない入力を使用してバイトを読み取り、浮動小数点値として再解釈できます。

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

Matlab が互換性のある形式を使用していない場合は、使用している形式を調べて、変換するコードを記述する必要があります。

于 2012-11-28T17:35:55.683 に答える
3

同じフォーマットを読み書きする必要があります。さらに言えば、Matlab から書き込んだものは、同じシステムを使用するかどうかに応じて読み取れる場合と読み取れない場合がある、フォーマットされていないバイト シーケンスです。おそらく、このフォーマットされていないバイト シーケンスを C++ プログラムに読み込むことはできますが (たとえば、 を使用std::istream::read())、データが保存されていると考えるべきではありません。

実際にデータを保存するには、データの形式を認識する必要があります。形式はバイナリまたはテキストにすることができますが、バイトの意味、表示される順序、バイト数、値の場合は終了を検出する方法などについて明確にする必要があります。

于 2012-11-28T17:35:46.460 に答える
1

を使用するfwriteのは最良のアイデアではありません。これは、プログラムで簡単に読み戻せる場合とそうでない場合があるため、データを内部形式で書き出すためです。

Matlab には、出力を書き込む他の方法があります。たとえば、fprintf などの関数です。この方法でデータを書き出すと、別のアプリケーションにデータを読み戻す方法が明らかになるはずです。

を使用するだけで、 を使用してこれを C/C++ で読み取るfprintf(fID, "%f\n", x)ことができるはずです。scanf

于 2012-11-28T17:41:42.550 に答える