Domanda

Sto stampando una variabile, diciamo Z1 che è un array da 1-D contenente numeri di punta mobile a un file di testo in modo da poter importare in matlab o gnuplot per la tracciamento. Ho sentito che i file binari (.dat) sono più piccoli dei file .txt. La definizione che attualmente utilizzo per la stampa in un file .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);
}   

Ho tre domande:

  1. I file binari sono davvero più compatti dei file di testo?;

  2. Se sì, vorrei sapere come modificare il codice sopra in modo da poter stampare i valori dell'array Z1 su un file binario. Ho letto che FPRINTF deve essere sostituito con FWRITE. Il mio file di output dice che dodo.dat dovrebbe contenere i valori dell'array Z1 con un numero mobile per riga.

  3. Ho %.16le up nel mio codice ma penso che %.15le sia giusto in quanto ho 15 cifre di precisione con doppio lungo. Ho messo un punto (.) Nella posizione di larghezza poiché credo che ciò consenta l'espansione in un campo arbitrario di tenere il numero desiderato. Ho ragione? Ad esempio con %.16le, posso avere un'output come 1.0047914240730432E-002 che mi dà 16 cifre di precisione e la larghezza del campo ha la larghezza giusta per visualizzare correttamente il numero. Il posizionamento di un punto (.) Nella posizione della larghezza invece di un valore di larghezza è una buona pratica?

Molte grazie...

AGGIORNARE Sta cambiando in:

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

Ok, oltre alla modifica in "WB+"? Non riesco a leggere il file binario in matlab.

È stato utile?

Soluzione

  1. Sì, i file binari sono più compatti, ma si perde la portabilità e ci sono anche vari altri potenziali problemi, quindi a meno che i file di dati non siano problematicamente enormi o lentamente per l'esportazione/importazione, è una buona idea restare con il testo se puoi (tu (tu può sempre comprimere per la conservazione, ad esempio con zip)

  2. Apri il tuo file con "wb" invece di "w" e usa fwrite() - Non hai più "righe" nel tuo file - Sarà solo un flusso di valori (binari) di punta mobile

  3. Potresti confonderti tra double e long double - un long double Può avere una dimensione fino a 16 byte e avere una precisione fino a circa 32 cifre (tuttavia questo è dipendente dall'implementazione: il doppio lungo può essere comunemente 10, 12 o 16 byte). UN double di solito è 8 byte e ha una precisione di circa 16 cifre.

Matlab potrebbe non essere in grado di far fronte long double (in quanto non è ben standardizzato) Quindi probabilmente vuoi solo scrivere doppie sul tuo file di dati, ad esempio

for (i = 0; i < z_size; i++)
{
    double z = (double)z1[i];
    fwrite(&z, sizeof(double), 1, out);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top