C – leer y almacenar el archivo de datos para cálculos posteriores

Normalmente uso R y tengo muchos problemas para entender C. Necesito leer y almacenar un archivo de datos, que se muestra a continuación, para poder realizar cálculos en los datos. Estos cálculos dependen de la información introducida por el usuario. Aquí están los datos que estoy tratando de leer (llamados “Descargas / exchange.dat” en mi código),

dollar 1.00 yen 0.0078 franc 0.20 mark 0.68 pound 1.96 

Aquí es donde estoy hasta ahora. Esto lee la primera línea de datos solamente y también la devuelve, que no es lo que quiero. Necesito leer este archivo completo, almacenar los tipos de cambio con sus respectivas monedas y poder realizar cálculos sobre ellos más adelante.

Creo que necesito un typedef , tal vez? Más adelante en el progtwig, le pido al usuario información como “¿Convertir desde?” y “convertir a?”. En cuyo caso, ingresarán “mark”, “yen”, “dollar”, etc. y espero que coincidan con su respuesta al tipo de cambio correspondiente (utilizando la biblioteca string.h ).

Mi código hasta ahora, para leer en los datos:

 #include  main(int argc, char *argv[]) { FILE *fpt; // define a pointer to pre-defined structure type FILE char c; // open the data file for reading only if ((fpt = fopen("Downloads/exchange.dat", "r")) == NULL) printf("\nERROR - Cannot open the designated file\n"); else // read and display each character from the data file do putchar(c = getc(fpt)); while (c != '\n'); // close the data file fclose(fpt); } 

Siento que necesito algo similar, pero completamente diferente para leer y almacenar un archivo de datos completo. Tu ayuda es apreciada.

Tendrá que crear una estructura de datos para mantenerlos y luego un vector de esta estructura que mantendrá cada lectura de moneda. Debe utilizar la función fscanf que no solo le ahorrará dividir valores manualmente sino que también los convertirá para usted. Aquí hay algo que se me ocurrió:

 /* to store each currency you read */ struct currency { char name[256]; double value; }; int main(int argc, char ** argv) { FILE * fp = fopen("x.dat", "r"); int count = 0, i; struct currency currencies[30]; /* this will read at most 30 currencies, and stop in case a * end of file is reached */ while (count < 30 && !feof(fp)) { /* fscanf reads from fp and returns the amount of conversions it made */ i = fscanf(fp, "%s %lf\n", currencies[count].name, &currencies[count].value); /* we expect 2 conversions to happen, if anything differs * this possibly means end of file. */ if (i == 2) { /* for the fun, print the values */ printf("got %s %lf\n", currencies[count].name, currencies[count].value); count++; } } return 0; } 

Para volver a leerlos, deberá iterar en la matriz de currencies hasta que llegue a count iteraciones.

Dado que ya desea hacer coincidir esos valores con la función strcmp , lea el nombre de la moneda, repita la iteración en la matriz hasta que encuentre una coincidencia y luego realice los cálculos correspondientes.

Este es un conocimiento básico de C y, aunque entiendo que no estás acostumbrado a usarlo, te sugiero que leas un libro para encontrar estas respuestas en ellos.

Un ejemplo para escribir:

 FILE *fp; fp=fopen("c:\\test.bin", "wb"); char x[10]="ABCDEFGHIJ"; fwrite(x, sizeof(x[0]), sizeof(x)/sizeof(x[0]), fp); 

(escribir statement)

 size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file); 

Si fueras a leer,

 size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file); 

Te sugiero

  • define una estructura como:

typedef struct{ char currency[10]; double rate; }rate_currency;

  • obtener línea:

en su función principal, utiliza getline para leer el archivo línea por línea:

 while ((read = getline(&line, &len, fpt)) != -1) ... 
  • Separar:

    use strchr para buscar el space character para separar el nombre de la moneda del tipo de cambio

  • Insertar:

declarar una matriz de su estructura anterior:

rate_currency arrOfStruct[10]; a continuación, inserte uno por uno, por ejemplo:

arrOfStruct [0] .currency = “dollar”; // después de leerlo y separarlo … arrOfStruct [0] .rate = 1.00;

  • ¡Has terminado!