La lectura de los números ASCII utilizando “D” en lugar de “E” de la notación científica usando C

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

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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top