C/Visual C - ¿Cómo comparar un string con una palabra almacenada en un archivo .txt?

 
Vista:
Imágen de perfil de Zulema
Val: 5
Ha aumentado su posición en 6 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

¿Cómo comparar un string con una palabra almacenada en un archivo .txt?

Publicado por Zulema (2 intervenciones) el 01/03/2020 04:01:34
Tengo que realizar un programa el cual consiste en ingresar una frase y comprobar que esté bien escrita en español. Mi idea era separar el sujeto (una sola palabra), el verbo(una sola palabra) y el predicado (lo que encuentre el programa hasta el fin de la oración). De ahí, crear aparte tres archivos .txt: uno en el cual pueda ingresar una lista de sujetos, otro para un diccionario de verbos y otro de distintas frases que puedan hacer la función de predicado.

Es lo que traté de hacer y mi código principal es este:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
//Analizar si una frase capturada por el usuario está bien escrita en español.
#include <stdio.h>
#include <string.h>
#define cant 100
 
struct registro{
    char palabra_es[cant];
} est;
 
void Asignar_Char(char *p, char var[cant]);
int Evaluar_Sujeto(char ev_sujeto[cant]);
int Evaluar_Verbo(char ev_verbo[cant]);
int Evaluar_Predicado(char ev_predicado[cant]);
 
int main(){
    char frase[cant], sujeto[cant], verbo[cant], predicado[cant];
    char *p_sujeto, *p_verbo, *p_predicado;
    char espacio[4]=" \n\t";
 
    printf("Las oraciones en espa_ol por lo general contienen la siguiente estructura\n\t\t\tSUJETO + VERBO + PREDICADO\n");
    printf("Siguiendo dicha estructura, ingresa una frase: ");
    scanf("%100[^\n]", frase);
    printf("\n%s", frase);
    printf("\n\n");
 
    p_sujeto=strtok(frase,espacio);
    Asignar_Char(p_sujeto,sujeto);
    Evaluar_Sujeto(sujeto);
 
    p_verbo=strtok(NULL, espacio);
    Asignar_Char(p_verbo,verbo);
    Evaluar_Verbo(verbo);
 
    p_predicado=strtok(NULL, ".");
    Asignar_Char(p_predicado,predicado);
    Evaluar_Predicado(predicado);
    if (Evaluar_Sujeto(sujeto) == 0 && Evaluar_Verbo(verbo) == 0 && Evaluar_Predicado(predicado) == 0 ) printf("Oracion escrita correctamente");
    else printf("Oracion incorrecta");
 
    return 0;
}
 
 
void Asignar_Char(char *p, char var[cant]){
    int i=0;
    while (*p!='\0'){
        var[i]=*p;
        p++;
        i++;
    }
}
 
 
 
int Evaluar_Sujeto(char ev_sujeto[cant]){
    FILE *dic_s;
 
    dic_s=fopen("archivo_sujeto.dat", "rb");
    while (!feof(dic_s)){
        fread(&est, sizeof(est), 1, dic_s);
        if (strstr(ev_sujeto, est.palabra_es)!=NULL){
            printf("Existe");
            break;
            return 0;
        }
        else{
            printf("No existe");
            return -1;
        }
 
    }
    fclose(dic_s);
}
 
 
 
int Evaluar_Verbo(char ev_verbo[cant]){
    FILE *dic_v;
 
    dic_v=fopen("archivo_verbo.dat", "rb");
    while (!feof(dic_v)){
        fread(&est, sizeof(est), 1, dic_v);
        if (strstr(ev_verbo, est.palabra_es)!=NULL){
            printf("Existe");
            break;
            return 0;
        }
        else{
            printf("No existe");
            return -1;
        }
    fclose(dic_v);
}
 
 
 
int Evaluar_Predicado(char ev_predicado[cant]){
    FILE *dic_p;
 
    dic_p=fopen("archivo_predicado.dat", "rb");
    while (!feof(dic_p)){
        fread(&est, sizeof(est), 1, dic_p);
        if (strstr(ev_predicado, est.palabra_es)!=NULL){
            printf("Existe");
            return 0;
        }
        else{
            printf("No existe");
            return -1;
        }
    }
    fclose(dic_p);
}

Y por otro lado, cree otro programa que vaya creando los diccionarios

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//Analizar si una frase capturada por el usuario está bien escrita en español.
//este archivo sirve para crear los diccionarios
#include <stdio.h>
#include <string.h>
#define cant 100
 
struct registro{
    char palabra_es[cant];
} est;
 
 
int main(){
    FILE *dic_s; //Puntero a archivo -> Diccionario de Sujeto
    //FILE *dic_v; //Puntero a archivo -> Diccionario de Verbo
    //FILE *dic_p; //Puntero a archivo -> Diccionario de Predicado
 
 
    dic_s=fopen("archivo_sujeto.txt", "a+");
    //dic_v=fopen("archivo_verbo.txt", "a+");
    //dic_p=fopen("archivo_predicado.txt", "a+");
 
    do{
        scanf("%s",est.palabra_es);
        if (strcmp(est.palabra_es,"x")==0 ) break;
        fwrite(&est, sizeof(est),1,dic_s);
        //fwrite(&est, sizeof(est),1,dic_v);
        //fwrite(&est, sizeof(est),1,dic_p);
    }
    while (1);
 
    fclose(dic_s);
    //fclose(dic_v);
    //fclose(dic_p);
    return 0;
}


Mi problema está aquí en que no entiendo por qué cuando abro el diccionario .txt en sublime text, veo caracteres algo raros en hexadecimal, cuando ingreso más palabras en otro momento las funciones que evaluan la búsqueda de algún sujeto o predicado no las encuentran y se agregan caracteres basura o de plano hay otras ocasiones donde no encuentra las palabras aún a pesar de existir en los txt. ¿Me podrían ayudar a comprender esto? ¡Muchisimas gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder