2

バイナリファイルに格納されているフロートの配列をmatlabで読み込もうとしています。もともとファイルは、メモリ マッピングトリックを介して C++ コードで作成されました。

C++ コード:

#include <iostream>
#include <sys/types.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main() 
{
    const char* filePath   = "test_file.dat";
    const size_t NUM_ELEMS = 11;

    /* Write the float array to the binary file via memory mapping */
    const size_t NUM_BYTES = NUM_ELEMS * sizeof(float);//array of the 11 floats;    
    int fd = open(filePath, O_RDWR | O_CREAT | O_TRUNC, 0);//open file
    lseek (fd, NUM_BYTES - 1, SEEK_SET);//stretch the file size
    write(fd, "", 1);//write empty string at the end of file
    float* mappedArray = (float*)mmap(0, NUM_BYTES, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);//map array to the file

    for(size_t i = 0; i < NUM_ELEMS; ++i)//fill array
        mappedArray[i] = static_cast<float>(i) / 10.0f;

    munmap(mappedArray, NUM_BYTES);
    close(fd);

    /* Test reading the recorded file*/    
    std::ifstream fl(filePath, std::ios::in | std::ios::binary);
    float data = 0.0f;
    for(size_t i = 0; i < NUM_ELEMS; ++i)
    {
        fl.read(reinterpret_cast<char*>(&data), sizeof(data)); 
        std::cout<<data<<"\n";
    }

    fl.close();
}

C++ コードからのファイルの読み取りをテストすると、正しい結果が示されます。ファイルは正常に記録されました。C++ からの読み取り結果:

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8

ただし、このファイルを matlab から読み取ろうとすると、エラー (不正なデータ) が発生します。

Matlab コード:

function out = readDataFromFile()
    fid = fopen('test_file.dat','r','b'); 
    out = fread(fid, 11, '*float');  
    fclose(fid);
end

matlab からの読み取り結果:

0 -429492128 -428443584 -6,3526893e-23 -429492160 8,8281803e-44 -6,3320104e-23 4,1723293e-08 -428443616 2,7200760e+23 4,6006030e-41

uint8_t (または unsigned char) 配列を書き込むと、このファイルを matlab から読み取ることができることに注意してください。私はmatlabで何が間違っていますか?

私のシステム- 64 ビット Ubuntu 13.04、c++ コンパイラ- gcc 4.8、matlab - 2013a

4

1 に答える 1

0

問題は交換することで解決します

fid = fopen('test_file.dat','r','b');

fid = fopen('test_file.dat','r');
于 2013-10-07T21:06:36.983 に答える