Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Duda con archivos de texto

Estas en el tema de Duda con archivos de texto en el foro de C/C++ en Foros del Web. Hola que tal? estoy haciendo un programita de unas votaciones el cual me pide un numero de identificacion, lo busca en un archivo "votantes.txt" si ...
  #1 (permalink)  
Antiguo 07/11/2011, 15:31
 
Fecha de Ingreso: enero-2011
Ubicación: Venezuela, Táchira
Mensajes: 96
Antigüedad: 13 años, 4 meses
Puntos: 10
Duda con archivos de texto

Hola que tal? estoy haciendo un programita de unas votaciones el cual me pide un numero de identificacion, lo busca en un archivo "votantes.txt" si el numero ya esta significa que esa persona ya boto y no se puede agregar de nuevo, si no existe entonces se agrega al archivo..

el problema es que no se como buscar esto :( por favor si alguien me ayuda aa PD ojala sea con ifstream, ofstream ya que quiero evitar usar FILE *etc etc jeje
  #2 (permalink)  
Antiguo 07/11/2011, 15:35
Avatar de s00rk  
Fecha de Ingreso: octubre-2010
Ubicación: Mexico
Mensajes: 238
Antigüedad: 13 años, 6 meses
Puntos: 48
Respuesta: Duda con archivos de texto

Suponiendo que se guarda linea a linea
Ejemplo

21
76
90
76
...

Asi sucesivamente cada que haya votado

Solamente vamos recorriendo linea a linea si esta o no

Código C++:
Ver original
  1. ifstream ar("lala.txt");
  2. char linea[50];
  3. while(!ar.eof())
  4. {
  5.         ar.getline(linea,50);
  6.                 // Tu codigo para comprobar
  7. }

Ya con eso bastariao usando fseek tmb podria ser ...
  #3 (permalink)  
Antiguo 07/11/2011, 15:39
 
Fecha de Ingreso: enero-2011
Ubicación: Venezuela, Táchira
Mensajes: 96
Antigüedad: 13 años, 4 meses
Puntos: 10
Respuesta: Duda con archivos de texto

Hola gracias por responder, mira tengo algo parecido:

Código C++:
Ver original
  1. char linea[10];
  2.     ifstream lee;
  3.     lee.open("votantes.txt");
  4.     if(lee.good()){
  5.         while(!lee.eof()){
  6.             lee >> linea;
  7.             if(strcmp(linea,(edCedula->Text).c_str())==0){
  8.                 MessageDlg("Error, esta persona ya voto!", mtError, TMsgDlgButtons() << mbOK, 0 );
  9.                 edCedula->Clear();
  10.             }else{
  11.                 votante_nuevo();
  12.                 break;
  13.             }
  14.         }
  15.         lee.close();
  16.     }else{
  17.         MessageDlg("Error, No se pudo abrir el archivo!", mtError, TMsgDlgButtons() << mbOK, 0 );
  18.     }

estoy usando Builder C++ 6 para hacerlo en modo grafico, si te fijas en el ELSE de la comparacion llamo a una funcion votante_nuevo();

la cual es esta:

Código C++:
Ver original
  1. ofstream escr;
  2.     escr.open ("votantes.txt", ios::app);
  3.     escr << edCedula->Text.c_str() << "\n";
  4.     escr.close();
  5.  
  6.     MessageDlg("Votante aprobado!",mtInformation, TMsgDlgButtons() << mbOK, 0);
  7.     edCedula->Clear();

el problema es que al agregar el 2do votante me manda 2 mensajes votante aprobado! en el 3 votante me manda 3 mensajes y asi sucesivamente :/ y no compara todas las lineas solo la primera linea es la que esta comparando si existe o no
  #4 (permalink)  
Antiguo 07/11/2011, 16:25
Avatar de s00rk  
Fecha de Ingreso: octubre-2010
Ubicación: Mexico
Mensajes: 238
Antigüedad: 13 años, 6 meses
Puntos: 48
Respuesta: Duda con archivos de texto

No eso esta bien pero deves agregar al votante hasta terminar de checar todos los votantes osea

algo asi mira (suponiendo que tu codigo funciona bien)

Código C++:
Ver original
  1. bool voto = false;
  2.         char linea[10];
  3.         ifstream lee;
  4.         lee.open("votantes.txt");
  5.         if(lee.good()){
  6.             while(!lee.eof() && !voto){
  7.                 lee >> linea;
  8.                 if(strcmp(linea,(edCedula->Text).c_str())==0){
  9.                     voto = true;
  10.                 }
  11.             }
  12.             lee.close();
  13.         }else{
  14.             MessageDlg("Error, No se pudo abrir el archivo!", mtError, TMsgDlgButtons() << mbOK, 0 );
  15.         }
  16.         if(voto){
  17.              MessageDlg("Error, esta persona ya voto!", mtError, TMsgDlgButtons() << mbOK, 0 );
  18.                     edCedula->Clear();
  19.        }else{
  20.               votante_nuevo();
  21.        }


Asi lo que hace es leer y cuando sea igual cambia voto a true, entonces dejara de leer el archivo, porque ya lo encontro, luego al final de leerlo y demas si voto = false (osea que no voto) ingresara al nuevo votante y si voto hara lo que tenias anteriormente y listo.
  #5 (permalink)  
Antiguo 08/11/2011, 05:47
 
Fecha de Ingreso: enero-2011
Ubicación: Venezuela, Táchira
Mensajes: 96
Antigüedad: 13 años, 4 meses
Puntos: 10
Respuesta: Duda con archivos de texto

gracias sOOrk me ha funcionado perfecto jeje solo hacia falta la bandera bool esa , otra cosa como ordenaria ese archivo en forma asendente? se ordenar vectores con metodos de ordenamiento no se si se aplica lo mismo a archivos
  #6 (permalink)  
Antiguo 08/11/2011, 07:41
Avatar de s00rk  
Fecha de Ingreso: octubre-2010
Ubicación: Mexico
Mensajes: 238
Antigüedad: 13 años, 6 meses
Puntos: 48
Respuesta: Duda con archivos de texto

Con fseek podria ser o tmb puedes leer el archivo con un contador y cada linea va aumentado luego crear un arreglo del tamaño del contador y luego vuelves a leer y los vas agregando al arreglo y luego lo ordenas y ya de eso sobreescribes con tu arreglo.
  #7 (permalink)  
Antiguo 08/11/2011, 09:00
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 1 mes
Puntos: 228
Respuesta: Duda con archivos de texto

fseek no es recomendable para este caso, porque lo registro no tienen la misma longitud.
Para ordenar yo cargaria todo en memoria lo ordenaria y luego lo guardaria en el archivo.
  #8 (permalink)  
Antiguo 08/11/2011, 10:29
Avatar de s00rk  
Fecha de Ingreso: octubre-2010
Ubicación: Mexico
Mensajes: 238
Antigüedad: 13 años, 6 meses
Puntos: 48
Respuesta: Duda con archivos de texto

Cita:
Iniciado por sam90 Ver Mensaje
fseek no es recomendable para este caso, porque lo registro no tienen la misma longitud.
Para ordenar yo cargaria todo en memoria lo ordenaria y luego lo guardaria en el archivo.
Si es lo que estaba pensando yo lo cargaria algo asi, aunque claro puede cargarlo todo en un string y luego con - o , y ya de ahi usar tokenizer y ya guardarlo en un arreglo.

Mientras yo lo hago algo mas am sencillo y "facil" de entender

Código C++:
Ver original
  1. int cont = 0;
  2.     char linea[50];
  3.     ifstream ar0("votos.txt");
  4.     ifstream ar1("votos.txt");
  5.     while(!ar0.eof())
  6.     {
  7.         ar0.getline(linea, 50);
  8.         cont++;                
  9.     }
  10.     ar0.close();
  11.     int arreglo[cont];
  12.     int i = 0;
  13.     cout << endl;
  14.     while(!ar1.eof())
  15.     {
  16.         ar1.getline(linea, 50);
  17.         arreglo[i] = atoi(linea);              
  18.         i++;
  19.     }
  20.     ar1.close();
  21.    
  22.     int aux;
  23.     for(int x = 1; x < cont; x++)
  24.     {
  25.             for(int xx = 0; xx < cont - x; xx++)
  26.             {
  27.                     if( arreglo[xx] > arreglo[xx+1] )
  28.                     {
  29.                         aux = arreglo[xx];
  30.                         arreglo[xx] = arreglo[xx+1];
  31.                         arreglo[xx+1] = aux;
  32.                     }
  33.             }
  34.     }
  35.     FILE *nuevo = fopen("votos.txt", "w");
  36.     for(int x = 0; x < cont; x++)
  37.     {
  38.             fprintf(nuevo, "%d \n", arreglo[x]);
  39.     }
  40.     fclose(nuevo);
  41.     return 0;
  #9 (permalink)  
Antiguo 08/11/2011, 15:22
 
Fecha de Ingreso: enero-2011
Ubicación: Venezuela, Táchira
Mensajes: 96
Antigüedad: 13 años, 4 meses
Puntos: 10
Respuesta: Duda con archivos de texto

osea me recomiendan guardar los registros en un vector dinamico ordenarlo y luego escribirlo en el archivo? eso estaba pensando yo jeje pense que podia hacer algo mas directo bueno hare eso gracias!

Etiquetas: c++
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:17.