Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-11-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola jcdca.
Cita:
Empezado por jcdca Ver Mensaje
necesito sacar una palabra de un archivo .txt con el siguiente formato:
QUESO;5
PLANCHA;4
TORTUGA;9
ZAPATO;6
HORMIGA;1
UNIVERSIDAD;3
TECLADO;8
INFORMATICA;7
INGENIERIA;2
LETRERO;10

el numero es el orden en como debo sacarla, y guardala en una variable. COMO LO HARIA? ESTO SERIA PARA EL LENGUAJE C
No me quedó muy claro lo que solicitas...
Pero te pongo un ejemplo que lee el archivo, separa las palabras de los números tomando en cuenta el delimitador ";" y va almacenando las palabras en un arreglo cuyo índice está dado por el número leido:
Código PHP:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_WORDS 1024

int main()
{
  
FILE *fp;
  
char vstr[MAX_WORDS][30] = {0};
  
char cad[40], aux[30], num[10], *ch;
  
int  iix;

  if ((
fp fopen("Archivo.TXT""rt")) == NULL) {
    
perror("Error");
    
fclose(fp);
    return 
1;
  }

  while ( !
feof(fp) ) {
    
fgets(cad40fp);    
    
ch strchr(cad';');
    
strncpy(auxcadch-cad);
    
aux[ch-cad]= '\0';
    
strncpy(numcad+(ch-cad+1), 10);
    
num[10]= '\0';
    
strcpy(vstr[atoi(num)], aux);
  }
  
fclose(fp);

  for(
0MAX_WORDSi++)
    if (
strlen(vstr[i]) > 0printf("%d %s\n"ivstr[i]);

  
getchar();
  return 
0;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 24-11-2014 a las 23:44:35. Razón: corregir ruta al archivo
Responder Con Cita
  #2  
Antiguo 25-11-2014
jcdca jcdca is offline
Miembro
NULL
 
Registrado: nov 2014
Posts: 15
Poder: 0
jcdca Va por buen camino
listo gracias, son unos genios jeje... es que nunca había usado el lenguaje c y hay cosas que se me complican todavía... ya me corre bien gracias a todos.. era eso de concatenar así: palabra+=caracter; lo puse como me dijeron con un indice y corre, pero ahora tengo otra duda, estoy tratando de que imprima solo una palabra, por ejemplo:
QUESO;5
PLANCHA;4
TORTUGA;9
ZAPATO;6
HORMIGA;1
UNIVERSIDAD;3
TECLADO;8
INFORMATICA;7
INGENIERIA;2
LETRERO;10

de esa lista que les di antes también, yo leo carácter por carácter, guardando la palabra, hasta llegar al punto y coma, cuando llego al punto y coma leo el numero y con un if lo comparo con el numero 1, para ver si es la primera palabra que en este caso seria hormiga, si no es la primera, borro la palabra y sigo buscando hasta conseguirla. asi tengo el código:

else
{ caracter = fgetc(archivo); //esto me lee el numero que esta al lado del punto y coma
int aux = (int) (caracter - 48); //esto me convierte ese numero en entero
if (aux==x) //esto me compara ese numero con x, que en este caso es 1
{palabra[i] = '\0';
printf("\n %s",palabra); getch(); break;
}else {}


el código así si funciona, pero me imprime todas las palabras hasta llegar a la primera, QUESOPLANCHATORTUGAZAPATOHORMIGA y se detiene cuando llega a la primera... la cosa es que necesito vaciar la variable para que no me las guarde todas, si no solo la ultima palabra... esa parte de vaciar tendría que ponerla en el ultimo else si no me equivoco... intente poniendo en el else esto: *palabra = '\0';, y nada, si pongo eso no me imprime nada de nada, no me da error pero tampoco me imprime.... también intente con palabra[0]=0; y lo mismo no imprime nada. probé también poniendo palabra[i] = '\0'; en el else y no hace nada, me sigue imprimiendo todas las palabras hasta la llegar a la primera.. y con la funcion memset() me da un error no se si es que me falta alguna librería o algo.

el getch(); es solo para que se detenga y ver si imprimia algo. y el break es para romper el ciclo, que imagino que ya lo saben, pero bueno jeje
Responder Con Cita
  #3  
Antiguo 25-11-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola jcdca.

Por favor, cuando incluyas código en tus mensajes usa las etiquetas como indica la siguiente imágen:


Saludos y gracias por tu colaboración
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 25-11-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Creo que te complicas mucho la vida, yo usaria archivos con registros de tamaño fijo.
En este ejemplo puedes ver como crear un archivo secuencial y lo relleno y luego busco en el tanto por nombre como por numero de registro. Es mucho mas sencillo de manejar.

Código PHP:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TAM_MAX_PALABRA 50
int main(int argccharargv[])
{
   
struct{
      
char palabra[TAM_MAX_PALABRA];
      
int index;
   }
registro;

   
char nombre[TAM_MAX_PALABRA];
   
int cantidadxindiceencontradanreadsalir=0;
   
char caracter;
   
FILE *archivo;

   
//ZONA DONDE CREO EL ARCHIVO SECUENCIAL Y LO RELLENO CON LOS REGISTROS
   
printf("\nIndique el numero de palabras a usar: ");
   
scanf("%d",&cantidad);

   
archivo fopen("prueba.txt","w"); //Abro el fichero para escritura

   
if(archivo != NULL){ //Si el archivo se ha abierto correctamente...
      
for(0cantidadx++){
         
printf("\n\nIntroduce el nombre del registro %d: "x);
         
fflush(stdin); //Limpiamos el buffer de entrada
         
fgets(registro.palabra,TAM_MAX_PALABRA,stdin); //es mas recomendable ya que permite guardar cadenas con espacios
         
printf("\nIntroduce el numero del registro %d: "x);
         
scanf("%d",&registro.index);

         
fwrite(&registro,sizeof(registro),1,archivo); //Guardo el registro
      
}
      
fclose(archivo); //Cierro el archivo
   
}

   
//ZONA DONDE BUSCO EL REGISTRO DESEADO
   
archivofopen("prueba.txt","r");

   if (
archivo== NULL){
      
printf("\nEl archivo no se encuentra.\n");
   }else{
      do{
         
//Mostramos el menú y esperamos hasta que se elija una opcion correcta
         
system("CLS"); //Limpiamos la pantalla
         
printf("\n\nELIGE EL TIPO DE BUSQUEDA\n");
         
printf("-------------------------\n\n");
         
printf("\t1.Por indice\n");
         
printf("\t2.Por nombre\n");
         
printf("\t3.Salir\n\n");
         
printf("\tOpcion: ");
         
scanf("%d",&x);

         switch(
x)
         {
            case 
1:
               
printf("\nElige el indice a buscar: ");
               
scanf("%d",&indice);
               break;

            case 
2:
               
printf("\nElige el nombre a buscar: ");
               
fflush(stdin); //Limpiamos el buffer de entrada
               
fgets(nombre,TAM_MAX_PALABRA,stdin); //es mas recomendable ya que permite guardar cadenas con espacios
               
break;

            case 
3:
               
salir 1;
               break;

            default:
               
printf("\n\tValor introducido incorrecto.");
               
printf("\n\tPulse Intro para continuar.");
               
fflush(stdin); //Limpiamos el buffer de entrada
               
getchar(); //Esperamos a que se pulse intro
         
}
      }while(
|| 3); //Si elegimos una opcion correcta saldremos del bucle

      
if(salir == 0){
         
encontrada 0;

         while (!
feof(archivo)){
            
nread fread(&registro,sizeof(registro),1,archivo);

            if(
nread == 0//Si no lee mas registros es porque llegamos al final
               
break;

            switch(
x)
            {
               case 
1:
                  if(
indice == registro.index){
                     
printf("\nPalabra encontrada: %s"registro.palabra);
                     
encontrada 1;
                  }
                  break;

               case 
2:
                  if(
strcmp(nombreregistro.palabra) == 0){
                     
printf("\nPalabra encontrada. Registro: %d"registro.index);
                     
encontrada 1;
                  }
                  break;
            }
         }

         if(
encontrada == 0)
            
printf("\nPalabra no encontrada.");

         
fclose(archivo); //Cerramos el archivo
         
printf("\n\n");
         
system("PAUSE");
      }
   }
   return 
0;
}
//--------------------------------------------------------------------------- 
Responder Con Cita
  #5  
Antiguo 25-11-2014
jcdca jcdca is offline
Miembro
NULL
 
Registrado: nov 2014
Posts: 15
Poder: 0
jcdca Va por buen camino
ya pude hacerlo, pero ahora tengo otro problemita recorro el archivo y saco las palabras en orden, y llamo a la funcion insertarenlista para meter todas las palabras en orden en una lista, al parecer si la llena o eso creo yo, pero al momento de imprimirla me muestra simbolos extraños, no se si es que la lleno mal, o que la imprimo mal o lo que sea, alguien sabe que tengo mal?

Código PHP:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct nodo
{
  
char palabra[30];
  
struct nodo*sig;
};

typedef struct nodo listaPalabra;

listaPalabra crearLista(listaPalabra *inicio)
{
   
inicio=NULL;
   return 
inicio;
}

listaPalabra *insertarEnLista(char palabra[30],listaPalabra *inicio)
{
       
listaPalabra *nuevoNodo;
       
listaPalabra *aux;
       
       
nuevoNodo=(listaPalabra*)malloc(sizeof(listaPalabra));
       
nuevoNodo->palabra[30]=palabra[30];
       
nuevoNodo->sig=NULL;
       
              
       
       if (
inicio == NULL)
       {
             
inicio=nuevoNodo;                  
       }
       else
       {
           
aux=inicio;
           
           while (
aux->sig !=NULL)
           {
                 
aux=aux->sig;                 
           }           
           
aux->sig=nuevoNodo;           
       }  
       return 
inicio;    
}

void imprimir (listaPalabra *lista)
{
     
listaPalabra *auxiliar;
     
auxiliar=lista;
     
     while (
auxiliar!=NULL)
     {
           
printf("%s \n",auxiliar->palabra);
           
auxiliar=auxiliar->sig;
     }
}


void Jugar(){
     
system ("color b");
     
system("cls");
     
int cantidad,i,j,aux,x,indice;
     
char caracter,palabra[30];   
     
printf("\n\t\t\t  ¿Con cuantas palabras desea jugar? ");  
     
scanf("%d",&cantidad);
     
x=1i=1j=0;
     
listaPalabra*lista;
     
lista=crearLista(lista);
     while (
i<=cantidad)
     {
       
FILE *archivo;
       
archivofopen("prueba.txt","r"); 
       if (
archivo== NULL)
       {
            
printf("El archivo no se encuentra");}
            else
            {                          
                while (
feof(archivo)==0)
                {
                       do
                       { 
                         
caracter=fgetc(archivo);
                       }while(
caracter=='\n');
                     
                   if (
caracter!=';')
                   {                      
                      
palabra[j]=caracter;
                      
j++;
                   }
                  else
                  {
                     
caracter=fgetc(archivo);
                     
aux= (int)(caracter-48);                     
                     if (
aux==i)
                     {                                                         
                        
lista=insertarEnLista(palabra,lista); 
                        
imprimir(lista);      
                      }                                          
                      
indice=0;
                      while (
indice<20)
                      {
                         
palabra[indice]=0;
                         
indice++;
                      }
                      
j=0;
                       
                  } 
            }  
                
close(archivo);
            } 
       
       
i++;
     }
                                    
     
getch();    
     }



void menu()
{
char resp;

  do
  { 
system ("color b"); 
       
system("cls");
    
printf("\n\n\t\t\t* * * * * MENU DE OPCIONES * * * * *");
    
printf("\n\t\t---------------------------------------------------");
    
printf("\n\t\t\t  Juego de el ahorcado ");
    
printf("\n\t\t---------------------------------------------------\n\n\n\n");
    
printf("\t\t\t\t (1) Jugar \n");
    
printf("\t\t\t\t (0) salir\n");

    do
     
resp=getch();

    while (
resp<'0' || resp>'1');
    switch(
resp)
     { case 
'1'Jugar();
         break;
      case 
'0'
         break;
     }
  }
  while(
resp!='0');
}


   
int main()
{
 
menu();

 return(
0);

Responder Con Cita
  #6  
Antiguo 25-11-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
lo he mirado por encima en el movil y la verdad es que no tiene mucho que ver con lo que mostrabas antes pero a simple vista, en la funcion que añade nuevos registros veo "nuevoNodo->palabra[30]=palabra[30]; " y eso está mal. Lo que haces es copiar el caracter 30 y solo ese. Puedes optar por usar strcpy, strncpy, o un bucle que copie todo el array pero no se puede copiar una cadena con un simple igual ya que lo que haces en realidad es asignar la direccion y no su contenido y al cambiar el contenido del array cambia en ambos.
Responder Con Cita
  #7  
Antiguo 25-11-2014
jcdca jcdca is offline
Miembro
NULL
 
Registrado: nov 2014
Posts: 15
Poder: 0
jcdca Va por buen camino
Para que sepan esto es lo que tengo que hacer:

Consiste en un juego donde el usuario deberá adivinar un conjunto de palabras las cuales serán cargadas desde un archivo con formato txt (su formato será indicado más adelante en el presente documento).
El juego consiste en que una vez cargue una lista de palabras a adivinar por el usuario, este deberá ir ingresando letras por el teclado, en caso de que la letra introducida pertenezca a la palabra deberá mostrarse por pantalla, en caso contrario, deberá restarle una vida.
Durante la partida el usuario podrá equivocarse cinco (5) veces máximo, luego de cometer este número de equivocaciones, la partida se dará por terminada y se le deberá notificar dicha situación, dándole la oportunidad de iniciar una nueva.
Al iniciar una partida se le deberá preguntar al usuario cuantas palabras desea que tenga la partida, siendo el mínimo 3 y el máximo 10, se leerán las todas las palabras que contenga el archivo y se mostrará dicho número introducido por el usuario siguiendo el orden que se muestra en la sección de estructura del archivo.
Las letras introducidas indican las teclas que van presionando los usuarios (deben omitirse los caracteres especiales tales como ñ, á, #, etc. Así como números 123456789, el número cero (0) si debe de leerse al ser introducido por teclado ya que será interpretado como la instrucción para finalizar la partida por parte del jugador.
Al finalizar la partida, debe de preguntársele al usuario nuevamente el número de palabras a ser mostradas, leerse la totalidad del archivo, ordenarlas según el formato y desplegar la cantidad de palabras indicadas por el usuario.
Para la lista de palabras a ser mostradas durante la partida deberá utilizarse obligatoriamente una lista u otro conjunto de manejo dinámico, bajo ningún concepto se permite utilizar arreglos para tal fin, el equipo que utilice este elemento para mostrar las palabras a ser utilizadas en la partida será reprobado lamentablemente con una nota de 01 en dicha entrega.
Las letras restantes, indican el resto de letras del abecedario que el usuario puede introducir todavía para la palabra que se muestra en pantalla.
Cada vez que se pase a una nueva palabra, la lista de letras introducidas y restantes deben reiniciarse, en el caso de las introducidas ponerse en blanco, en caso de las restantes, mostrar todo el abecedario (Omitir la letra ñ).
La siguiente línea de la interfaz deberá mostrar la palabra por la que va el jugador de las 10 cargadas.
Las vidas restantes, 5 en total, deberán mostrarse en pantalla con algún símbolo, corazón por ejemplo, cada vez que el usuario se equivoque, es decir introduzca una letra que no pertenezca a la palabra en pantalla se le restará una vida de las 5 disponibles.
Es importante resaltar que las vidas del usuario son para toda la partida, no por palabra, razón por la cual las mismas no deben reiniciarse al pasar a la siguiente palabra como si ocurre con las listas de letras introducidas y letras restantes.
Por último, como de indico anteriormente, debe mostrarse la opción para salir de la partida, es decir la tecla 0, si el usuario introduce dicho carácter, la partida deberá terminar y volver a leerse el archivo de 10 palabras ordenadas según se indique en la estructura del mismo.
En caso de que el usuario logre pasar las 10 palabras de la partida, el juego deberá notificarle que ha concluido con éxito la misma, felicitándolo y volviendo a iniciarse una nueva partida una vez el usuario haya culminado la misma.

Ya llene la lista con las palabras del archivo, ahora quiero sacar una por una para comparar las letras de la palabra con las introducidas por el usuario
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Guardar un DBGrid como archivo *.dbf richisaurio Conexión con bases de datos 13 25-01-2013 17:53:32
¿como guardar un archivo de texto como ANSI? JXJ Varios 2 09-09-2011 21:26:29
Posible Guardar QuickReport Como Archivo jirbert Varios 5 24-07-2008 10:27:40
Como guardar un TChart en archivo gif? crespopg Gráficos 1 04-05-2007 23:18:26
Como guardar un objeto en un archivo ? cmurua71 OOP 7 18-11-2005 21:26:30


La franja horaria es GMT +2. Ahora son las 22:42:01.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi