La lectura de los números ASCII utilizando “D” en lugar de “E” de la notación científica usando C
-
23-09-2019 - |
Pregunta
Tengo una lista de números que se ve así: 1.234D+1
o 1.234D-02
. Quiero leer el archivo usando C. La función atof
será simplemente ignorar la D
y traducir solamente la mantisa.
La función fscanf
no aceptará el formato de '%10.6e'
porque espera una E
en lugar de un D
en el exponente.
Cuando me encontré con este problema en Python, me di por vencido y simplemente utilizado una sustitución de cadenas antes de la conversión de cadena a flotador. Pero en C, estoy seguro de que debe haber otra manera .
Así que, ¿cómo leer un archivo con números utilizando D
en lugar de E
para la notación científica? Tenga en cuenta que no me refiero a cómo leer las cuerdas a sí mismos, sino más bien cómo convertir a los flotadores.
Gracias.
Solución
Se puede tomar ventaja de strtod y 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;
}
Salida:
E:\> cnv 1.234000e+001 1.234000e-002 5.000000e+000
Otros consejos
reemplazar D con E, haciendo un bucle a lo largo de la cadena. entonces atof
.
A continuación, esta función es reemplazar "D" en "E" en la notación científica con "D".
std::string dToE(string cppstr)
{
str1.replace(cppstr.find("D"),1,"E");
return cppstr;
}
Si la cadena C para la notación científica se define por:
char * cstr = "1.2D + 03";
o por lo general obtenido por el método strtok
, que devuelve la cadena C, a continuación, utilizar atof(dToE(string(cstr)).c_str())
para obtener la notación científica con "E".
Desde atof
sólo aceptan cadena estilo C, se debe utilizar el método de cadena c_str()
para convertir cadena de C ++ en cadena C.