Question

Je l'impression d'une variable dire z1 qui est un tableau 1-D contenant des nombres à virgule flottante dans un fichier texte afin que je puisse importer dans Matlab ou GNUPlot pour le traçage. Je l'ai entendu dire que les fichiers binaires (.dat) sont plus petits que les fichiers txt. La définition que j'utilise actuellement pour l'impression dans un fichier txt est:

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

J'ai trois questions:

  1. sont des fichiers binaires vraiment plus compact que les fichiers texte ?;

  2. Si oui, je voudrais savoir comment modifier le code ci-dessus afin que je puisse imprimer les valeurs du tableau z1 dans un fichier binaire. J'ai lu que fprintf doit être remplacé par fwrite. Mon fichier de sortie dire dodo.dat doit contenir les valeurs de z1 tableau avec un nombre à virgule flottante par ligne.

  3. J'ai% .16Le dans mon code, mais je pense que% .15Le est juste que j'ai 15 chiffres de précision avec une longue double. Je mets un point (.) Dans la position de largeur que je pense que cela permet l'expansion d'un champ arbitraire pour maintenir le nombre désiré. Ai-je raison? A titre d'exemple avec% .16Le, je peux avoir une sortie comme 1.0047914240730432e-002 qui me donne 16 chiffres de précision et la largeur du champ a la bonne largeur pour afficher le numéro correctement. Est de placer un point (.) Dans la position de largeur au lieu d'une valeur de la largeur d'une bonne pratique?

Merci beaucoup ...

UPDATE est à changer:

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

ok, en plus du changement "wb +"? Je ne peux pas lire le fichier binaire dans Matlab.

Était-ce utile?

La solution

  1. oui, les fichiers binaires sont plus compacts, mais vous perdez la portabilité et il y a d'autres problèmes potentiels aussi, donc à moins que vos fichiers de données sont problématiquement énormes, ou lent à exporter / importer, il est une bonne idée de coller avec texte si vous pouvez (vous pouvez toujours les compresser pour le stockage, par exemple avec zip)

  2. ouvrir le fichier avec « wb » au lieu de « w » et utilisez fwrite() - vous n'avez plus « lignes » dans votre fichier - ce sera juste un flux de valeurs (binaire) à virgule flottante

  3. vous pouvez se confondre entre double et long double - un long double peut être jusqu'à 16 octets de taille et ont une précision allant jusqu'à environ 32 chiffres (mais cela dépend de la mise en œuvre - long double peut généralement être 10 , 12 ou 16 octets). A double est généralement de 8 octets et a une précision d'environ 16 chiffres.

peut Matlab ne pas être en mesure de faire face à long double (comme il est pas bien standardisé) donc il vous suffit probablement écrire double à votre fichier de données, par exemple.

for (i = 0; i < z_size; i++)
{
    double z = (double)z1[i];
    fwrite(&z, sizeof(double), 1, out);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top