2010-04-05 2 views
0

플로팅 포인트 수를 텍스트 파일에 포함하는 1 차원 배열 인 변수 z1을 인쇄하므로 플로팅을 위해 Matlab 또는 GNUPlot으로 가져올 수 있습니다. 바이너리 파일 (.dat)이 .txt 파일보다 작다고 들었습니다. 나는 현재 .txt 파일로 인쇄에 사용하는 정의는 다음과 같습니다이진 파일 인쇄 및 원하는 정밀도

void create_out_file(const char *file_name, const long double *z1, size_t z_size){ 
FILE *out; 
size_t i; 
if((out = _fsopen(file_name, "w+", _SH_DENYWR)) == NULL){ 
fprintf(stderr, "***> Open error on output file %s", file_name); 
exit(-1); 
} 
for(i = 0; i < z_size; i++) 
fprintf(out, "%.16Le\n", z1[i]); 
fclose(out); 
} 

내가 세 가지 질문이 : 정말 텍스트 파일보다 더 컴팩트

  1. 이진 파일을?;

  2. 그렇다면 위 코드를 수정하여 배열 z1 값을 이진 파일로 인쇄 할 수있는 방법을 알고 싶습니다. 나는 fprintf가 fwrite로 대체되어야한다는 것을 읽었다. 출력 파일에 dodo.dat에 배열 z1의 값이 줄 당 하나의 부동 번호가 있어야한다고 나와 있습니다.

  3. 나는 내 코드에서 최대 .16Le까지 가지만, 나는 15 % 정밀도가 긴 double 값을 가지므로 % .15Le가 맞다고 생각한다. 나는 임의의 필드를 확장하여 원하는 숫자를 유지할 수 있다고 믿기 때문에 점 (.)을 너비 위치에 두었습니다. 내가 맞습니까? % .16Le의 예로서, 1.0047914240730432e-002와 같은 결과를 얻을 수 있습니다.이 필드는 16 자리의 정밀 자릿수를 제공하며 필드의 너비는 숫자를 올바르게 표시하기 위해 올바른 너비를 갖습니다. 폭 값 대신 폭 (.)을 배치하는 것이 좋습니다. "WB +"로 변경 이외에

    for(i = 0; i < z_size; i++) 
    fwrite(&z1, sizeof(long double), 1, out); 
    

    확인 :

덕분에 많은 ...

UPDATE이로 변경되어 있습니까? Matlab에서 이진 파일을 읽을 수 없습니다.

답변

0
  1. 예, 바이너리 파일은 컴팩트하지만, 당신은 휴대 성을 상실하고 데이터 파일/가져 오기를 수출된다는 문제가 큰, 또는 느린하지 않는 한, 그것은 집착하는 것이 좋습니다 그래서 여러 가지 다른 잠재적 인 문제도있다 텍스트가있는 경우 가능하면 (예 : 우편 번호와 같이 저장 용으로 항상 압축 할 수 있음)

  2. "w"가 아닌 "wb"로 파일을 열고 fwrite()을 사용하여 파일을 열면 파일에 " 그냥 (이진) 부동 소수점 값의 스트림이 될 것입니다

  3. 혼란 스러울 수 있습니다. tween doublelong double - long double의 크기는 최대 16 바이트 일 수 있으며 최대 32 자까지의 정밀도를 갖습니다 (그러나 구현에 따라 다릅니다 - 긴 double은 일반적으로 10, 12 또는 16 바이트가 될 수 있음). double은 보통 8 바이트이며 정밀도는 약 16 자리입니다.

MATLAB (이것은 잘 표준화되지 않는) long double에 대처하지 못할 수 있습니다 그래서 당신은 아마 당신의 데이터 파일, 예를 들어,에 두 배를 기록 할

for (i = 0; i < z_size; i++) 
{ 
    double z = (double)z1[i]; 
    fwrite(&z, sizeof(double), 1, out); 
} 
+0

감사합니다. 내 새 구현은 괜찮습니까? – yCalleecharan

+0

@yCalleecharan : 아닙니다 - z1의 색인을 놓치 셨습니다. 그리고 'long double'대신 'double'파일을 쓰고 싶을 것입니다. 위의 편집을 참조하십시오. –

+0

고마워. 지금은 괜찮아.나는 Matlab에서 다음과 같이 테스트했다 : 형식 길이; fid = fopen ('vz3.dat', 'r'); mydata = fread (fid, 'double') 그리고 괜찮아 보인다. z1을 long double으로 정의했지만, double로 변환하면 여기에 캐스트됩니까? double과 long double 모두 내 컴퓨터에서 15 자리의 정밀 숫자를가집니다. – yCalleecharan