2012-11-28 3 views
4

내 주요 질문은 문자 데이터 형식이 아닌 파일에서 데이터를 읽는 방법에 관한 것입니다. 내가 MATLAB의 데이터 파일을 쓰고 다음과 같이C++의 파일에서 숫자를 읽으려면 어떻게해야합니까?

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

을 그럼 난 변하지 않는 다음 코드 "NUM"를 사용하여 C++에서 그것을 읽을 때.

#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 플래그가 설정되지 않았기 때문에 루프 코드가 지저분합니다.

답변

6

형식화 된 입출력은 <<을 사용합니다. >> 실제로 숫자 값을 텍스트로 읽고 씁니다.

아마도 Matlab은 부동 소수점 값을 이진 형식으로 쓰고 있습니다. C++과 동일한 형식 (대부분의 구현이 표준 IEEE 이진 형식을 사용)을 사용하는 경우 형식이 지정되지 않은 입력을 사용하여 바이트를 읽고 부동 소수점 값으로 다시 해석 할 수 있습니다.

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

Matlab이 호환 가능한 형식을 사용하지 않는 경우, 사용하는 형식을 찾아서 변환 할 코드를 작성해야합니다.

+0

fin.read에 char 포인터가 필요하기 때문에 컴파일러에서 오류가 발생합니다 – user1860611

+0

@ user1860611 : 죄송합니다. 생각보다 빨리 입력하고 있습니다. 지금 컴파일해야합니다. –

+0

그 트릭을 했어, 정말 고마워. – user1860611

3

동일한 형식을 읽고 사용해야합니다. Matlab에서 작성한 것은 동일한 시스템을 사용하는지 여부에 따라 읽을 수있는 또는 읽을 수없는 바이트의 포맷되지 않은 시퀀스입니다. 이 형식이 지정되지 않은 바이트 시퀀스를 C++ 프로그램 (예 : std::istream::read())으로 읽을 수는 있지만 데이터를 저장하지 않아야합니다.

실제로 데이터를 저장하려면 데이터의 형식을 알아야합니다. 형식은 바이너리 또는 텍스트 일 ​​수 있지만 바이트가 무엇인지, 어떤 순서로 나타나는지, 몇 개가 있는지, 값이 있으면 끝을 감지하는 방법 등에 대해 명확해야합니다.

1

fwrite을 사용하면 내부 형식으로 데이터를 쓰게되므로 프로그램에서 다시 읽는 것이 쉽지 않을 수 있으므로 가장 좋은 생각은 아닙니다.

Matlab에는 다른 방법으로 출력을 기록 할 수 있습니다. fprintf와 같은 함수. 이 방법으로 데이터를 더 잘 작성한 다음 다른 응용 프로그램으로 다시 읽는 방법을 분명히해야합니다.

그냥 fprintf(fID, "%f\n", x)을 사용하면 scanf을 사용하여 C/C++에서이 코드를 읽을 수 있습니다.

+0

팁 주셔서 감사.(matlab은 '% f \ n'btw에 대해 작은 따옴표를 사용합니다.) – user1860611

+0

너무 많은 C/C++가 아니라 Matlab입니다. 마치 C 인 것처럼 보입니다. – Zane

관련 문제