buscar y extraer un valor en un fichero en C++

Iniciado por huskerone, 31 Agosto 2011, 00:05 AM

0 Miembros y 2 Visitantes están viendo este tema.

huskerone

buenas a todos , digamos que tengo un archivo asi :

NOMBRE
Rolando
PESO
52
ALTURA
1.56

O  este otro caso

NOMBRE Rolando PESO 52 ALTURA 1.56

como me posiciono en por ejemplo PESO y saco el valor 52 para hacer operaciones con ese valor?

se como abrir y cerrar ficheros y como escribir estos datos en el, pero no se como buscar una palabra determinada y leer el valor que sige ya sea si este esta en la misma linea o en la de abajo como en este caso,

Riki_89D

un bucle for asta que encuentre un numero?,eso aria yo en el peor de los casos....,ir comparando el caracter que recore el bucle,y cuando encuentre numero pues que lo vaya guardando en un array,y de alli realizar las operaciones,no se me ocurre otra cosa,quizas aiga alguna funcion que lo haga pero vamos ni idea :S



suerte amigo

Dark Invader

Te voy a dar una pista de ccomo lo haria yo:

Primero leo la primera linea con gets,y hago un strlen(palabra),si la longitud de la cadena tiene los mismos caracteres que nombre,significa que en esa linea solo esta el nombre y haria un salto de linea para leer el nombre mas abajo,si todo esta en la misma linea,se podria usar la "debilidad" de fscanf de leer hasta un espacio,leeria hasta nombre ,un espacio,y luego leeria la siguiente cadena...Esto es una idea aproximada,necesitaras usar fseek para moverte por el archivo para hacer lo que te dije...

Otra manera mas larga,seria ir caracter por caracter,si el primer caracter coincido meto una condicion de que si el siguiente tambien coincide que siga en el bucle,cada caracter estará metido en una cadena,y luego comprobaria la cadena,es decir:

Nombre:

Si caracter leido igual a n,seguimos,sino se sale del bucle,si caracter leido igual a o seguimos dentro...


Hay otra,pero es con punteros,y no se si los has dado  :silbar:

Un saludo

Riki_89D

La forma de Dark Invader me parece bastante buena :),la de recorrer caracter x caracter (que es la que use yo) no es tan "professional",pero vamos el objetivo es ese mismo.



suerte

El_Java

Dark Invader explica como lo harias con punteros anda, que no se me ocurre xD

do-while

#5
¡Buenas!

Da igual que los datos esten en una linea o en varias. Lo que tienes en el fichero son pares de tipo_dato/valor, por lo tanto, lees el tipo de dato en un string, y si coincide con el que buscas lees el valor asociado. Es decir tienes que leer el par tipo_dato/valor, hasta que tipo_dato sea el que buscas...

Para leer los datos, investiga sobre las funciones de stdio.h (cstdio) o los operadores/funciones de iostream.

http://www.cplusplus.com/

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Dark Invader

#6
Cita de: El_Java en 31 Agosto 2011, 16:38 PM
Dark Invader explica como lo harias con punteros anda, que no se me ocurre xD

Si tengo tiempo lo hago El_Java,(bueno ya lo he intentado y estoy teniendo problemas,por bocas  :xD ) de todas maneras las otras dos formas las he dejado,la de los punteros intentare dedicarle mas tiempo,pero creo que hable mas de la cuenta al decir que se haria con punteros,en fin...Como dicen,no hay nada imposible de hacer con C  :silbar:

Tambien podrias utilizar la siguiente funcion:

http://foro.elhacker.net/programacion_cc/funcion_findstring-t337296.0.html

oPen syLar

A ver.. Solo es para un ejemplo.? O quieres hacerlo para un software que andas desarrollando.? porque no metes todos los datos en un XML.?


Con esa estructra lo que haria yo Es.. un...

fgets(oPen, 255, channel);     //Para leer linea por linea

Y luego un...


strstr(oPen, "52")     //Busco la cadena 52


Saludos =)
Siempre habra 2 verdades, la que quieres creer y la que no aceptaras

huskerone

gracias a todos por las respuestas,

en realidad el archivo tiene esta estructura :

18.20   20.22   32.55
15.58   02.58   11.25
25.66   45.85   36.45

cada columna corresponde a un mismo tipo de dato
entonces lo que tengo que hacer es recuperar esos datos, tonces por ejemplo me piden el primer dato y yo imprimo en pantalla

registro 1  registro 2 registro 3
18.20       15.58       25.66

sin embargo no se el numero de lineas en el archivo , ya que depende de cuantas se hallan metido, intente con este codigo para contar las lineas del archivo y asi poder hacer un bucle que me imprima la palabra registro 1 registro 2 y assi, pero me cuenta las lineas en 0

int main () {
char c;
int num=0;
ifstream archivo;
is.open ("fichero.txt");
while (archivo.good())
{
c = archivo.get();
if (c=='\n')num++;
}
is.close();
}



y luego he invetigado pero no se como accedder  alos datos que ocupo, ya sea la primera columna , segunda o tercera

tengo este codigo

strcat(datoscliente.identificacion, ".dat"); //aqui abre el archivo
  ifstream archivoreporte (datoscliente.identificacion, ios::in);
 
     if(!archivoreporte){
                         cerr<<"NO SE PUDO ABRIR EL ARCHIVO"<<endl;
                         exit(1);
                         }

cout <<"   QUE DATO DESEA COMPARAR HISTORICAMENTE ?"<<endl;
     
     cout <<endl;
     cout <<"   PESO                                           (1)" <<endl;
     cout <<"   TALLA                                          (2)" <<endl;
     cout <<"   % DE GRASA                                (3)" <<endl;
     cout <<endl;
     cout <<endl;
     cout <<"   POR FAVOR , ESCOJA UNA OPCION"<<endl;
     cout <<"   ";cin>>opcion;

switch (opcion)
                 {
                    case 1:
                        for (int i=0;i<=num;i++){
                            cout<<"REG "<<i<<setw(5);
                        }

                        NO SE QUE HACER
                       
                        break;
                    case 2:
                         
                     
                        break;
                    case 3:
                       
                        break;
                    default:
                        cout <<"   EL VALOR INGRESADO NO CORRESPONDE A NINGUN MENU, POR FAVOR , TRATE DE NUEVO";
                        cout <<"   PRESIONA CUALQUIER TECLA PARA CONTINUAR\n";
                        getch();
                        system("cls");
                        reporte();
                 }//fin switch

LearningSpanishProgrammer

Si se utiliza de el C++ entonces debe utilizar de la funciones

no han sido evaluados, pero diebe ejecutar



#include <fstream>
#include <sstream>
#include <iostream>
#include <string>

...


std::ifstream file("filename");
if (!file)
  return -1;

std::string encabeziamento;
if (!std::getline(encabeziamento))
  return -1;

std::string linea;
while (file >> linea)
{
   double v1, v2, v3;
   std::istringstream parser(linea)

   parser >> v1 >> v2 >> v3
}


Estoy aprendiendo español, y tu estas aprendiendo programación