L'écriture d'un double type de valeur dans un fichier texte
Le code ci-dessous est l'écriture des caractères illisibles dans le fichier texte:
int main ()
{
ofstream myfile ("example.txt");
if (myfile.is_open())
{
double value = 11.23444556;
char *conversion = (char *)&value;
strcat (conversion, "int main ()
{
ofstream myfile ("example.txt");
if (myfile.is_open())
{
double value = 11.23444556;
char *conversion = (char *)&value;
strcat (conversion, "\0");
myfile.write (conversion, strlen (conversion));
myfile.close();
}
return 0;
}
");
myfile.write (conversion, strlen (conversion));
myfile.close();
}
return 0;
}
Je veux voir le nombre écrit dans le fichier 🙁 Conseils s'il vous plaît.
MODIFIER
Voir les réponses ci-dessous, j'ai modifié le code comme:
int main ()
{
ofstream myfile ("example.txt");
if (myfile.is_open())
{
double value = 11.23444556;
myfile << value;
myfile.close();
}
return 0;
}
Ce produit le putput: 11.2344 bien que le nombre réel est 11.23444556. Je veux le numéro complet.
Éditer le post pour informer tout le monde:
Les caractères illisibles sont dues à ofstream l'écriture de la fonction:
C'est un non formaté fonction de sortie
Cette citation est tirée de: http://www.cplusplus.com/reference/iostream/ostream/write/
La valeur par défaut est l'affichage 6 chiffres, si vous voulez plus de précision, vous pouvez faire
Persson: pour obtenir 10 chiffres dans le nombre,
Le moulage d'un double comme ça, autres que de mal dans ce cas, viole stricte aliasing règle, d'une façon ou l'autre, votre code n'aurait pas travaillé.
Quelle est donc la bonne façon de casting?
Vous avez besoin de faire une union avec le double et le type que vous voulez jeter, ou à l'utilisation memcopy. Le dernier sur les récentes compilateurs doivent être optimisées à l'écart et le code résultant serait exactement ce que vous attendez, mais formellement correct. Check this out: stackoverflow.com/questions/4163126/...
myfile << setprecision(10) << value;
pour obtenir 10 chiffres dans le nombre.Persson: pour obtenir 10 chiffres dans le nombre,
std::fixed
est également nécessaire, ou bien les zéros de fin willn'pas être imprimé.Le moulage d'un double comme ça, autres que de mal dans ce cas, viole stricte aliasing règle, d'une façon ou l'autre, votre code n'aurait pas travaillé.
Quelle est donc la bonne façon de casting?
Vous avez besoin de faire une union avec le double et le type que vous voulez jeter, ou à l'utilisation memcopy. Le dernier sur les récentes compilateurs doivent être optimisées à l'écart et le code résultant serait exactement ce que vous attendez, mais formellement correct. Check this out: stackoverflow.com/questions/4163126/...
OriginalL'auteur Aquarius_Girl | 2011-06-03
Vous devez vous connecter pour publier un commentaire.
Pourquoi ne pas vous suffit de le faire (mis à jour en réponse à l'issue de la modifier dans la question):
Maintenant, vous pouvez voir le nombre écrit dans le fichier.
Consultez la documentation de
std::setprecision
. Notez que vous avez à inclure<iomanip>
fichier d'en-tête, et voir comment cela fonctionne : http://www.ideone.com/XNZjKConsultez maintenant. J'ai mis à jour. Utilisation
std::fixed
etstd::setprecision(8)
Merci, maintenant il a fonctionné à merveille! Pouvez-vous dire QUEL était le problème avec le code d'origine?
OriginalL'auteur Nawaz
Il est plus facile d'utiliser ici le flux des opérateurs:
vous donne ce que vous voulez.
OriginalL'auteur MGwynne
Vous pouvez écrire la valeur de fichier comme ceci:
À l'aide de l'adresse de la valeur comme paramètre
strcat
corrompt votre pile, carstrcat
attend un 0 à terminaison c-string comme premier argument (et en fait l'espace alloué).OriginalL'auteur maxschlepzig
D'autres ont suggéré de mieux égards, mais si vous voulez vraiment faire le pointeur de la façon dont il devrait y avoir des moulages de convertir char* double * et vice versa
OriginalL'auteur Umut Tabak