Leggendo i numeri ASCII con “D” al posto di “E” per la notazione scientifica utilizzando C
-
23-09-2019 - |
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.
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.