플로팅 포인트 수를 텍스트 파일에 포함하는 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);
}
내가 세 가지 질문이 : 정말 텍스트 파일보다 더 컴팩트
이진 파일을?;
그렇다면 위 코드를 수정하여 배열 z1 값을 이진 파일로 인쇄 할 수있는 방법을 알고 싶습니다. 나는 fprintf가 fwrite로 대체되어야한다는 것을 읽었다. 출력 파일에 dodo.dat에 배열 z1의 값이 줄 당 하나의 부동 번호가 있어야한다고 나와 있습니다.
나는 내 코드에서 최대 .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에서 이진 파일을 읽을 수 없습니다.
감사합니다. 내 새 구현은 괜찮습니까? – yCalleecharan
@yCalleecharan : 아닙니다 - z1의 색인을 놓치 셨습니다. 그리고 'long double'대신 'double'파일을 쓰고 싶을 것입니다. 위의 편집을 참조하십시오. –
고마워. 지금은 괜찮아.나는 Matlab에서 다음과 같이 테스트했다 : 형식 길이; fid = fopen ('vz3.dat', 'r'); mydata = fread (fid, 'double') 그리고 괜찮아 보인다. z1을 long double으로 정의했지만, double로 변환하면 여기에 캐스트됩니까? double과 long double 모두 내 컴퓨터에서 15 자리의 정밀 숫자를가집니다. – yCalleecharan