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

erro en funciones para ingresar y reescribir palabras en un txt

Estas en el tema de erro en funciones para ingresar y reescribir palabras en un txt en el foro de C/C++ en Foros del Web. hola quiero hacer un diccionario y mi idea es tener un archivo que guarde las palabras de este modo: a Primera letra del abecedario español. ...
  #1 (permalink)  
Antiguo 30/11/2012, 18:52
 
Fecha de Ingreso: septiembre-2012
Mensajes: 29
Antigüedad: 12 años, 2 meses
Puntos: 0
erro en funciones para ingresar y reescribir palabras en un txt

hola quiero hacer un diccionario y mi idea es tener un archivo que guarde las palabras de este modo:
a
Primera letra del abecedario español. Vocal fuerte o abierta. Preposición.
abad
El que dirige una abadía o monasterio.
"palabra"
"significado"
.
.
etc.
Luego, lo que hago es una función que primero me pida que quiero hacer, luego me ingrese la nueva palabra o sobrescriba su significado. Pero me ha tirado una serie de errores que no se que hacer con ellos. lo estoy haciendo con tda y ficheros. creo es la forma mas fácil pero no se.

aquí esta el código sobretodo me interesan saber lo malo de las funciones
pb reescribir_significado(pb x, int n, pb* c) y
pb ingresar_palabra(pb x, pb* c, int n)
ahí es donde metí la pata. Disculparan por el código es un poco extenso.
Código C++:
Ver original
  1. #include<iostream>
  2. #include <string.h>
  3. #include <cstdlib>
  4. #include <stdio.h>
  5. using namespace std;
  6. int strcmp(const char[], const char[]);
  7.  
  8. struct palabra_p{
  9.        char* palabra;
  10.        char* significado;
  11.  
  12. };
  13.  
  14. typedef palabra_p* pb;
  15.  
  16. pb crear_palabra(){
  17.       pb x=new palabra_p;
  18.       x->palabra=new char[50];
  19.       x->significado=new char[100];
  20.       return x;
  21. }
  22. void liberar_palabra(pb x){
  23.       delete[] x->palabra;
  24.       delete[] x->significado;
  25.       delete[] x;
  26. }
  27.  
  28. pb leer_palabra(pb x){
  29.       cout<<"Digite la palabra: ";
  30.       cin.getline(x->palabra,50);
  31.           while(strlen(x->palabra)==0){
  32.                cin.getline(x->palabra,50);
  33.           }
  34.       cout<<"Digite el significado: ";
  35.       cin.getline(x->significado,100);
  36.           while(strlen(x->significado)==0){
  37.                cin.getline(x->significado,100);
  38.           }
  39.       return x;
  40. }
  41.  
  42. pb reescribir_significado(pb x, int n, pb* c){ //reescribe el significado de una palabra ya existente
  43.  
  44.  
  45. FILE *fichero;
  46. if (fichero == NULL) perror ("Error opening file");
  47.    else
  48.    {
  49.  while ( ! feof (fichero) )
  50.    fichero = fopen("palabras.txt", "r+");
  51.  while(!feof(fichero)) {
  52.   cout<<"Digite la palabra: ";
  53.       cin.getline(x->palabra,50); //ingresa palabra
  54.           while(strlen(x->palabra)==0){  //pide ingresarla en caso de no haber ingresado nada.
  55.                cin.getline(x->palabra,50);
  56.                     for(int i=0;i<n;i++){
  57.                 if(strcmp(x->palabra, c[i]) <= 0); // busca la palabra
  58.                cin.getline(x->significado,50);//ingresa el significado
  59.                //strcpy(c[i+1],x->significado);
  60.                c[i+1]=x->significado; //reescribe el significado.
  61. cout<<x->palabra<<endl<<x->significado;
  62. }}}}
  63.  
  64. pb ingresar_palabra(pb x, pb* c, int n){ //ingresa una palabra sin significado
  65.  
  66.  
  67. FILE *fichero;
  68. if (fichero == NULL) perror ("Error opening file");
  69.    else
  70.    {
  71.  while ( ! feof (fichero) )
  72.    fichero = fopen("palabras.txt", "r+");
  73.  while(!feof(fichero)) {
  74.         for(int i=0;i<n;i++){
  75.   cout<<"Digite la palabra: ";
  76.      x=leer_conjunto_palabras(pb* c, int n); //ingresa palabra
  77.           while(strlen(x->palabra)==0){  //pide ingresarla en caso de no haber ingresado nada.
  78.                cin.getline(x->palabra,50);
  79.                  for(int i=0;i<n;i++){
  80.                     if(strcmp(x->palabra, c[i]) <= 0); // busca la palabra
  81.                         cout<<"la palabra ya existe";//ingresa el significado
  82.                     else   
  83.                      //strcpy(c[i+1],x->palabra);
  84.                    
  85.                          c[i]=x->palabra; //reescribe el significado.
  86. cout<<x->palabra<<endl<<x->significado;
  87. }}}}}
  88.  
  89. void imprimir_palabra(pb x){
  90.      cout<<"\nInformacion de la palabra\n";
  91.      cout<<"-------------------------\n";
  92.      cout<<"palabra: \t"<<x->palabra;
  93.      cout<<"\nsignificado: \t\t"<<x->significado;
  94. }
  95.  
  96. void seleccionar(pb* c,int n,int x){
  97.      switch(x){
  98.          
  99.                case 1:
  100.                     cout<<"\n___________________________________\n";    
  101.                     cout<<"\nordenamiento de palabras\n";
  102.                     cout<<"___________________________________\n\n";
  103.                     c=pb ingresar_palabra(pb x, int n);
  104.                     imprimir_palabra(pb x);
  105.                break;
  106.                 case 2:
  107.                     cout<<"\n___________________________________\n";    
  108.                     cout<<"\nordenamiento de palabras\n";
  109.                     cout<<"___________________________________\n\n";
  110.                     c=pb reescribir_significado(pb x, int n);
  111.                     imprimir_palabra(pb x);
  112.                break;
  113.                                            
  114.                default:
  115.                cout<<"el numero tiene que ser 1, 2 o 3"<<endl;
  116.                    
  117.                }
  118.                  
  119.      
  120.      
  121. }
  122.  
  123. int main(){
  124. cout<<"\n\n\n\n";
  125. cout<<"que desea hacer"?
  126. cout<<" 1 ingresar nueva palabra";
  127. cout<<" 2 resscribir significado de palabra";
  128.     int n=0;
  129.     cin>>n;
  130.     pb* conjunto=new pb[n];
  131.     conjunto=seleccionar(int n);
  132.  
  133.     system("pause");
  134. }

aquí el informe de errores.
In function 'palabra_p* reescribir_significado(pb, int, palabra_p**)':
57 40 C:\Users\Fredy\Desktop\Tipos de dato abstarctos\diccionario 0.3.cpp [Error] cannot convert 'pb {aka palabra_p*}' to 'const char*' for argument '2' to 'int strcmp(const char*, const char*)'
60 17 C:\Users\Fredy\Desktop\Tipos de dato abstarctos\diccionario 0.3.cpp [Error] cannot convert 'char*' to 'pb {aka palabra_p*}' in assignment
64 40 C:\Users\Fredy\Desktop\Tipos de dato abstarctos\diccionario 0.3.cpp [Error] a function-definition is not allowed here before '{' token
134 1 C:\Users\Fredy\Desktop\Tipos de dato abstarctos\diccionario 0.3.cpp [Error] expected '}' at end of input

Última edición por sonrasiel; 30/11/2012 a las 20:42
  #2 (permalink)  
Antiguo 01/12/2012, 10:31
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 10 meses
Puntos: 94
Respuesta: erro en funciones para ingresar y reescribir palabras en un txt

Hola! de C++ se muy poco, pero tengo una pregunta: como es posible que en el main llames asi a la funcion seleccionar(int n) y en la funcion tengas void seleccionar(pb* c,int n,int x) ????? y por en la llamada especificas int n

en C me daria un error fatal :)


Saludos
  #3 (permalink)  
Antiguo 01/12/2012, 11:00
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 3 meses
Puntos: 83
Respuesta: erro en funciones para ingresar y reescribir palabras en un txt

Tienes mas errores, en la linea 57 tienes un if terminado en ;

Por lo demas, la propias definiciones de error te indican que sucede: en la misma 57 usas un strcmp que se prototipa como 'int strcmp ( const char * str1, const char * str2 );' pero tu no le envias los datos esperados: como primer argumento envias un char* pero que puedes solucionarlo con un typecast:

Código:
struct palabra_p {
    char* palabra;
    char* significado;
}
typedef palabra_p* pb;


pb reescribir_significado(pb x, int n, pb* c) {
    strcmp((const char *)x->palabra, c[i])...
}
Y ahora viene lo mejor: que envias como segundo argumento? Supongo que no intentaras typecastearlo para que te deje compilar... Ten en cuenta que cuando haces un typecast tienes que estar seguro de lo que manipulas porque el dato casteado se interpretará tal como le indiques (esto implica que puede dar desde un resultado incorrecto a un bof)

Lo demas son corchetes no cerrados.

Si quieres hacer listas de datos tal vez quieras echar un vistazo a alguna libreria de bases de datos: gdbm en este caso te iria perfecto (tambien puedes usar sqlite, ambas trabajan con ficheros aislados)

Otra cosa, creo que te he comentado en otro post que la funcion de entrada main es de tipo entero, y como tal debe retornar un entero.

Saludos
vosk

Etiquetas: erro, funcion, funciones, int, palabras, reescribir, string, txt
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 08:21.