Leggendo i numeri ASCII con “D” al posto di “E” per la notazione scientifica utilizzando C

StackOverflow https://stackoverflow.com/questions/2555097

Domanda

Ho una lista di numeri che assomiglia a questo: 1.234D+1 o 1.234D-02. Voglio leggere il file utilizzando C. La funzione atof si limita a ignorare il D e tradurre solo la mantissa.

La fscanf funzione non accetterà la '%10.6e' formato perché si aspetta un E invece di un D nel esponente.

Quando mi sono imbattuto in questo problema in Python, ho rinunciato e solo usato una sostituzione di stringhe prima della conversione da stringa a stare a galla. Ma in C, io sono sicuro che ci deve essere un altro modo .

Quindi, come è possibile leggere un file con numeri utilizzando D invece di E per la notazione scientifica? Si noti che non voglio dire come leggere le corde stesse, ma piuttosto come convertirli in carri.

Grazie.

È stato utile?

Soluzione

È possibile usufruire di strtod e 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;
}

Output:

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

Altri suggerimenti

sostituire D con E, dal looping lungo stringa. poi atof.

Ecco questa funzione è quello di sostituire "D" in "E" nella notazione scientifica con "D".

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

Se la stringa di C per la notazione scientifica è definita da:     char * cstr = "1.2D + 03"; o di solito ottenuti con il metodo strtok, che restituisce stringa di C, quindi utilizzare atof(dToE(string(cstr)).c_str()) per ottenere la notazione scientifica con "E".

Dal atof solo accettare stringa stile C, si dovrebbe utilizzare il metodo stringa c_str() per convertire stringa C ++ nella stringa C.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top