Como comparar un string con una palabra dentro de un documeto de texto

Iniciado por lordluisiv, 3 Abril 2019, 03:19 AM

0 Miembros y 1 Visitante están viendo este tema.

lordluisiv

Buenas espero que todos esten bien.
bueno creo que ya el titulo explica todo, aqui estan las librerias que uso y la el string que quiero comparar...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

FILE *doc;
char DATA_B[3][12];

int main(){

strcpy(DATA_B[0],"Var1");
strcpy(DATA_B[1],"Var2");
strcpy(DATA_B[2],"Var3");
............
..................
............................



aqui es donde leo los e imprimo los datos del documento de texto, no logro que compare el string con la palabra que esta escrita en el documento. ejm:

doc.txt{
Var1= 12
Var2= 13
Var3= 99
}

y en el programa solo imprimir el 12, 13, 99

pero no lo logro hacer, si me pudieran ayudar pls

{
doc = fopen("registro.txt","r");
char read;
char palabra;
if(doc == NULL)
{
printf("ERROR EN EL ARCHIVO");
return 1;
}               

printf("\n\n\t--------Datos Cargados--------\n");
while((read = getc(doc)) != EOF)
{
palabra += read;
if(read == '\n'|| strcmp(palabra, DATA_B[0]) == 0  && read == '=')
{
printf("\n");
}else{
printf("%c",read);
}

}
fclose(doc);
return 1;
}

K-YreX

No entiendo muy bien lo que pretendes hacer, ni lo que haces, ya que lo que estás guardando es {"Var1" / "Var2" / "Var3"} pero en ningún momento estás guardando los números con el "=".
Además <palabra> es un <char> cuando creo que lo que querías es que fuera un array de <char>.

Y creo que esto no se cumple nunca:

palabra += read;
strcmp(palabra, DATA_B[0]) == 0  && read == '='

Porque cuando <palabra> es igual a <DATA_B[0]> ("Var1") en <read> todavía tienes almacenado el "1".
Cuando en <read> tienes almacenado el "=", en <palabra> ya tendrías "Var1=" (asumiendo que corrijas lo de que <palabra> es un array). 
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

lordluisiv

Cita de: YreX-DwX en  3 Abril 2019, 10:23 AM
No entiendo muy bien lo que pretendes hacer, ni lo que haces, ya que lo que estás guardando es {"Var1" / "Var2" / "Var3"} pero en ningún momento estás guardando los números con el "=".
Además <palabra> es un <char> cuando creo que lo que querías es que fuera un array de <char>.

Y creo que esto no se cumple nunca:

palabra += read;
strcmp(palabra, DATA_B[0]) == 0  && read == '='

Porque cuando <palabra> es igual a <DATA_B[0]> ("Var1") en <read> todavía tienes almacenado el "1".
Cuando en <read> tienes almacenado el "=", en <palabra> ya tendrías "Var1=" (asumiendo que corrijas lo de que <palabra> es un array). 

lo que trato de hacer es guardar los caracteres de la palabra "Var1" pero no se como hacerlo, lo que trato de hacer es esto.
https://foro.elhacker.net/programacion_cc/cguardar_y_cargar_datos_de_un_fichero_txt-t494053.0.html

Cita de: YreX-DwX en 28 Marzo 2019, 22:11 PM
No sé qué parte es la que quieres que te explique pero imagino que es la solución a tu pregunta. Tienes un fichero de texto que guarda:

string (VARIABLE) + char (A/B/C) + char (=) + int (numero)

Lo que tú haces es guardar caracter a caracter en <c> e ir mostrándolos. En lugar de eso crea una variable de tipo <string>, otras dos de tipo <char> y otra de tipo <int>. Entonces guardas en la de tipo <string> la palabra "VARIABLE", en la primera de tipo <char> la letra y en la segunda el "=" y en la de tipo <int> el número. Entonces puedes mostrar sólo la de tipo <int> para mostrar el número o hacer un condicional que si la variable que guarda la letra es igual a {A, B, C} muestre el valor de la de tipo <int> y sino no.
Una vez tienes toda la información del fichero en variables puedes hacer lo que quieras con ello. Las variables las puedes sobreescribir para ahorrar en memoria ya que siempre vas a guardar "VARIABLE" e "=". Si quieres almacenar cada letra con su número correspondiente de forma más "permanente" (que puedas usarlas luego en el programa) entonces ya podrías hacerlo con un array de <char> y otro de <int> o usando clases o estructuras. Pero para lo que quieres hacer no es necesario.

jeje aun sigo intentando pero no lo logro


K-YreX

Vale. Todo depende de cómo estés guardando esos datos. Tienes varias opciones como pueden ser:
  • Pedir al usuario la cadena entera (no te lo recomiendo... el usuario siempre tiende a equivocarse y tenemos que vigilar todo lo que hace  :xD)
  • Pedir al usuario el numero y el resto de la cadena lo creamos nosotros
  • No pedir nada al usuario y establecer unos valores fijos en tiempo de compilacion
  • Estan los datos en el fichero y tenemos que cogerlos de ahi

    Según la opción que quieras implementar, tenemos que seguir unas restricciones u otras.
    Si no es la opción 4, yo te recomendaría la segunda opción, te evitas los problemas de la primera y no pierdes tanta funcionalidad como en la tercera (estoy suponiendo que nosotros conocemos los nombres de las variables de antemano, es decir, que van a ser "var1", "var2", etc) Si lo que quieres es que el usuario introduzca el nombre que el quiera para la variable, entonces hay que implementar la primera opción.

    Coméntame cuál se adapta mejor a lo que quieres/necesitas e intentaré echarte una mano desde lo más básico para corregir el problema de raíz. :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

lordluisiv

Cita de: YreX-DwX en  4 Abril 2019, 04:12 AM
Vale. Todo depende de cómo estés guardando esos datos. Tienes varias opciones como pueden ser:
  • Pedir al usuario la cadena entera (no te lo recomiendo... el usuario siempre tiende a equivocarse y tenemos que vigilar todo lo que hace  :xD)
  • Pedir al usuario el numero y el resto de la cadena lo creamos nosotros
  • No pedir nada al usuario y establecer unos valores fijos en tiempo de compilacion
  • Estan los datos en el fichero y tenemos que cogerlos de ahi

    Según la opción que quieras implementar, tenemos que seguir unas restricciones u otras.
    Si no es la opción 4, yo te recomendaría la segunda opción, te evitas los problemas de la primera y no pierdes tanta funcionalidad como en la tercera (estoy suponiendo que nosotros conocemos los nombres de las variables de antemano, es decir, que van a ser "var1", "var2", etc) Si lo que quieres es que el usuario introduzca el nombre que el quiera para la variable, entonces hay que implementar la primera opción.

    Coméntame cuál se adapta mejor a lo que quieres/necesitas e intentaré echarte una mano desde lo más básico para corregir el problema de raíz. :-X
quiero algo parecido a la 4ta opcion, lo que quiero hacer es como un sistema de guardado, que busque el nombre de X variable y cargue su contenido

K-YreX

Entonces no tiene ningún sentido que guardes los datos en la matriz usando <strcpy()> como has hecho.
Lo que tienes que hacer es: de un fichero que ya tiene las variables guardadas con su valor y todo, meterlas en una matriz. Te dejo un ejemplo mejor que ir caracter a caracter...

#define MAX_SIZE 20

int main(){
    FILE *fichero;
    fichero = fopen("fichero.txt", "r");
    char registro[MAX_SIZE][MAX_SIZE];
    int num_variables = 0; // numero de variables/lineas del fichero
    while(!feof(fichero))
        fgets(registro[num_variables++], MAX_SIZE, fichero);
    num_variables--;
}


Luego tienes que pedir una palabra/variable y buscar en la matriz si está y si está devolver el valor que está a la derecha del "=". Mírate las funciones de la librería <string.h> ya que son de utilidad para este ejercicio.
PD: Te recomiendo pedir la palabra usando la función <fgets()> (tendrás que hacer una pequeña modificación para quitar el ENTER que le des al terminar de escribir la palabra).

Vete probando lo que te comento y cuando te quedes bloqueado, intento ayudarte más específicamente ya que ahora estoy ocupado. Suerte :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

lordluisiv

Cita de: YreX-DwX en  4 Abril 2019, 22:00 PM
Entonces no tiene ningún sentido que guardes los datos en la matriz usando <strcpy()> como has hecho.
Lo que tienes que hacer es: de un fichero que ya tiene las variables guardadas con su valor y todo, meterlas en una matriz. Te dejo un ejemplo mejor que ir caracter a caracter...

#define MAX_SIZE 20

int main(){
    FILE *fichero;
    fichero = fopen("fichero.txt", "r");
    char registro[MAX_SIZE][MAX_SIZE];
    int num_variables = 0; // numero de variables/lineas del fichero
    while(!feof(fichero))
        fgets(registro[num_variables++], MAX_SIZE, fichero);
    num_variables--;
}


Luego tienes que pedir una palabra/variable y buscar en la matriz si está y si está devolver el valor que está a la derecha del "=". Mírate las funciones de la librería <string.h> ya que son de utilidad para este ejercicio.
PD: Te recomiendo pedir la palabra usando la función <fgets()> (tendrás que hacer una pequeña modificación para quitar el ENTER que le des al terminar de escribir la palabra).

Vete probando lo que te comento y cuando te quedes bloqueado, intento ayudarte más específicamente ya que ahora estoy ocupado. Suerte :-X

Ok muchas gracias, tratare hacerlo así