Frage

Ich drucke eine Variable, die z1 ist, ein 1-D-Array, das schwimmende Punktnummern für eine Textdatei enthält, damit ich zum Plotten in Matlab oder Gnuplot importieren kann. Ich habe gehört, dass Binärdateien (.dat) kleiner sind als .txt -Dateien. Die Definition, die ich derzeit zum Drucken in einer .txt -Datei verwende, lautet:

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);
}   

Ich habe drei Fragen:

  1. Sind Binärdateien wirklich kompakter als Textdateien?;

  2. Wenn ja, möchte ich wissen, wie Sie den oben genannten Code ändern, damit ich die Werte des Array Z1 in eine binäre Datei drucken kann. Ich habe gelesen, dass Fprintf durch FWRite ersetzt werden muss. Meine Ausgabedatei heißt, Dodo.dat sollte die Werte von Array Z1 mit einer schwebenden Zahl pro Zeile enthalten.

  3. Ich habe %.16le in meinem Code, aber ich denke, dass %.15le richtig ist, da ich 15 Präzisionsstellen mit langem Doppel habe. Ich habe einen Punkt (.) In die Breite gestellt, da ich glaube, dass dies die Erweiterung auf ein willkürliches Feld ermöglicht, die gewünschte Zahl zu halten. Habe ich recht? Als Beispiel mit %.16le kann ich eine Ausgabe wie 1.0047914240730432E-002 haben, was mir 16 Präzisionsstellen verleiht und die Breite des Feldes die richtige Breite hat, um die Zahl korrekt anzuzeigen. Ist es eine gute Praxis, einen Punkt (.) In die Breite zu platzieren, anstatt einen Breitenwert?

Danke vielmals...

AKTUALISIEREN Wechselt zu:

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

OK zusätzlich zur Änderung zu "WB+"? Ich kann die Binärdatei in Matlab nicht lesen.

War es hilfreich?

Lösung

  1. Ja, binäre Dateien sind kompakter, aber Sie verlieren die Portabilität und es gibt auch verschiedene andere potenzielle Probleme kann sie immer für die Speicherung komprimieren, z. B. mit Reißverschluss)

  2. Öffnen Sie Ihre Datei mit "wb" anstelle von "w" und verwenden Sie fwrite() - Sie haben keine "Zeilen" in Ihrer Datei - es ist nur ein Strom von (binären) schwimmenden Punktwerten.

  3. Sie werden möglicherweise verwirrt dazwischen double und long double - a long double Kann bis zu 16 Bytes an Größe sein und eine Genauigkeit von bis zu 32 Ziffern aufweisen (dies ist jedoch implementierungsabhängig - langes Doppel kann häufig 10, 12 oder 16 Bytes sein). EIN double ist normalerweise 8 Bytes und hat eine Präzision von etwa 16 Ziffern.

MATLAB kann möglicherweise nicht damit fertig werden long double (Da es nicht gut standardisiert ist) Sie möchten also wahrscheinlich nur Doppel in Ihre Datendatei schreiben, z. B.

for (i = 0; i < z_size; i++)
{
    double z = (double)z1[i];
    fwrite(&z, sizeof(double), 1, out);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top