2010-03-31 7 views
1

J'ai une liste de nombres qui ressemble à ceci: 1.234D+1 ou 1.234D-02. Je veux lire le fichier en utilisant C. La fonction atof ignorera simplement le D et ne traduira que la mantisse.Lecture des nombres ASCII en utilisant "D" au lieu de "E" pour la notation scientifique en utilisant C

La fonction fscanf n'acceptera pas le format '%10.6e' car il attend un E au lieu d'un D dans l'exposant.

Lorsque j'ai rencontré ce problème en Python, j'ai abandonné et simplement utilisé une substitution de chaîne avant de passer de la chaîne à float. Mais en C, je suis sûr qu'il doit y avoir une autre façon. Alors comment lire un fichier avec des nombres en utilisant D au lieu de E pour la notation scientifique? Notez que je ne veux pas dire comment lire les chaînes elles-mêmes, mais plutôt comment les convertir en chars.

Merci. Remplacer D par E, en faisant une boucle le long d'une chaîne.

Répondre

1

Vous pouvez profiter de strtod et strtok:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) { 
    char in[] = "1.234D+1 ABCD 1.234D-02 5\n"; 
    char *cursor; 
    char *endp; 
    for (cursor = strtok(in, " "); cursor; cursor = strtok(NULL, " ")) { 
     double d = strtod(cursor, &endp); 
     if (*endp == 'D') { 
      *endp = 'e'; 
      d = strtod(cursor, &endp); 
     } 
     if (endp != cursor) { 
      printf("%e\n", d); 
     } 
    } 
    return 0; 
} 

Sortie:

E:\> cnv 
1.234000e+001 
1.234000e-002 
5.000000e+000
+0

Je suis déçu que C manque de support natif pour lire la notation scientifique en utilisant 'D' au lieu de' E'. Votre code proposé est le plus proche d'une solution parfaite. Merci! – Escualo

+3

@Arrieta: Je suis déçu qu'il ne puisse pas analyser les nombres où la lettre Q apparaît à la place du chiffre 0 (zéro). Il semble que les concepteurs de bibliothèques n'aient pas compris à quel point nos exigences sont essentielles pour tant de programmes ... ;-) –

0

Ici cette fonction est de remplacer "D" dans "E" dans la notation scientifique avec "D" .

std::string dToE(string cppstr) 
{ 
    str1.replace(cppstr.find("D"),1,"E"); 
    return cppstr; 
} 

Si la chaîne C pour la notation scientifique est définie par: char * CSTR = "1.2D + 03"; ou généralement obtenu par la méthode strtok, qui retourne la chaîne C, puis utilise atof(dToE(string(cstr)).c_str()) pour obtenir la notation scientifique avec "E".

Puisque atof accepte uniquement la chaîne de style C, vous devez utiliser la méthode de chaîne c_str() pour convertir la chaîne C++ en chaîne C.

Questions connexes