Dev - C++ - AYUDA URGENTE PARA OPERAR CON DATOS DE UN FICHERO

   
Vista:

AYUDA URGENTE PARA OPERAR CON DATOS DE UN FICHERO

Publicado por Erica (1 intervención) el 22/09/2016 13:07:52
Hola!!

Soy bastante novata en programación y necesito que me ayudéis!!
Tengo que entregar un ejercicio en el que recoja datos de un fichero externo y trabaje con ellos aplicándoles operaciones.

- La primera duda que tengo es que el primer dato del fichero es una fecha y el segundo una hora del tipo: 02/10/1992 10:21 ¿qué tipo de datos son estos? ¿Vale poner tipo int?

- Después tengo que coger para cada hora y fecha los otros dos datos que me dan (energía y caudal) y aplicarles unas operaciones para sacar un archivo que ponga los datos calculados para cada hora y fecha.

Estuve mirando y he llegado a algo como lo que os muestro abajo, pero está claro que no es lo que quiero. Tendría que hacer un bucle para cada fecha/hora y que me fuera calculando la variable operando con los datos del fichero de entrada.

Agradecería mucho que me ayudaseis porque es bastante importante. No sé si me expliqué muy bien porque es complicado.

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
ifstream observaciones;

observaciones.open("observaciones.txt");

int a,b,c,d;
int z;

observaciones >> a >> b >> c >> d;

//error si el archivo no está creado

if (observaciones.fail()){

cerr << "el archivo no fue encontrado\n";
exit(1);
}

cout << a << " " << b << c << d;

observaciones.close();

z=c*2+d;


ofstream solucion;
solucion.open("solucion.txt");

solucion << z;

solucion.close()


return 0;


}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

AYUDA URGENTE PARA OPERAR CON DATOS DE UN FICHERO

Publicado por Thanatos (113 intervenciones) el 25/09/2016 07:10:26
Me parece que el principal problema que tienes, es separar los datos al leer cada linea del archivo de entrada.

Cuando indicas que además de la fecha y la hora te dan otros datos (energía y caudal), supongo que están en la misma linea y también separados por espacios, por ejemplo:

1
10/12/2016 10:21 21.7 40.54

Si ese es el formato, podrías hacer algo como esto para extraer los datos, y luego utilizarlos individualmente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <fstream>
 
using namespace std;
 
struct Linea {
    short dia;
    short mes;
    short anio;
    short horas;
    short minutos;
    float energia;
    float caudal;
};
 
bool leerLinea(istream &, Linea &);
 
int main() {
    Linea linea;
    const char archivo[] = "observaciones.txt";
 
    ifstream lector(archivo);
    if (lector.is_open()) {
        while (!lector.eof()) {
            if (leerLinea(lector, linea)) {
                cout << "fecha ----> " << linea.dia  << '/'
                                       << linea.mes  << '/'
                                       << linea.anio << '\n';
 
                cout << "hora -----> " << linea.horas   << ':'
                                       << linea.minutos << '\n';
 
                cout << "energia --> " << linea.energia << '\n';
                cout << "caudal ---> " << linea.caudal  << "\n\n";
            }
        }
    } else {
        cout << "\n* No se pudo abrir el archivo *\n";
    }
    lector.close();
 
    return 0;
}
 
bool leerLinea(std::istream &lector, Linea &linea) {
    lector >> linea.dia;
    (void) lector.ignore(1);  // ignora /
    lector >> linea.mes;
    (void) lector.ignore(1);  // ignora /
    lector >> linea.anio;
    lector >> linea.horas;
    (void) lector.ignore(1);  // ignora :
    lector >> linea.minutos;
    lector >> linea.energia;
    lector >> linea.caudal;
 
    return lector.good();
}

Las líneas 26 a 34 muestran cómo puedes utilizar cada miembro de la estructura "Linea", para acceder a los datos extraídos del archivo. En este caso, en lugar de usar las variables a, b, c y d, tendrías que utilizar linea.dia, linea.mes, linea.anio, etc., lo que te dará mayor control al momento de darles formato a las líneas del archivo de salida (solucion.txt).

En el código utilicé el tipo float para la energía y el caudal, si prefieres utilizar enteros (como lo hiciste en tu código), sólo tendrás que cambiar el tipo de dato de esos dos miembros del struct Linea.

Para asegurarte de que no existan problemas al leer la última línea del archivo de entrada, éste debe finalizar con una línea vacía (sin caracteres, espacios, tabulaciones, etc.)

Esta es sólo una alternativa para separar los datos, también podría hacerse utilizando la función sscanf o mediante expresiones regulares.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar