Reputation: 17
I need to read a .txt file and to allocate each word from the file in a struct which is pointed from a vector of structs. I'll explain better below.
I appreciate your help.
My program is allocating only the first word of the file...
I know that the problem is in the function insere_termo() cause I've tested the fscanf whitout calling the function and it's doing ok.
STRUCTS
typedef struct _item
{
int conta; //contador
char *termo; //palavra
} Item;
typedef struct _mapa
{
int total; // número de itens no mapa
int blocos; // número de blocos de itens alocados
Item **lista; // vetor de ponteiros para itens
} Mapa;
MAIN
int main()
{
Mapa mp;
FILE *arq;
int i, result, numPalavras;
float x;
int valor, max, min, mincar;
char caminho[20];
char termo[40];
int tam;
inicia_mapa(&mp);
valor = menu();
HERE'S THE IMPORTANT PART OF MY CODE. WHERE I READ A FILE IN THE PATH GIVEN BY THE USER AND CALL THE FUNCTION insere_termo();
WHICH IS RESPONSIBLE FOR ALLOCATING EACH WORD IN THE struct
.
switch (valor)
{
case 1:
printf ("*Ler Arquivo* \n");
printf("Digite caminho: ");
scanf("%s", caminho);
arq = fopen(caminho,"r"); // abrir arquivo no caminho especificado
if (arq == NULL)
{
printf("Erro, nao foi possivel abrir o arquivo\n");
}
while(fscanf(arq, "%s", termo) != EOF)
{
//Adiciona cada palavra no vetor
insere_termo(&mp, termo);
}
break;
FUNCTIONS
INICIA_MAPA() IS THE FUNCTION WHICH IS RESPONSIBLE FOR INITIATING THE MAP, ALLOCATING A BLOCK OF 10 POINTERS TO THE STRUCT "ITEM".
INSERE_TERMO() IS THE FUNCTION WHICH IS RESPONSIBLE FOR ALLOCATING THE WORDS GIVEN BY THE TEXT FILE. THERE'S SOME PROBLEM WITH THE MEMORY ALLOCATION BUT I COULDN'T FIGURE IT OUT. ANY HELP IS WELCOME.
void inicia_mapa (Mapa *mp) //inicia um mapa vazio
{
mp->lista = (Item**)malloc(BLOCK*sizeof(Item*));
mp->total = 0;
mp->blocos = 1;
}
void insere_termo (Mapa *mp, char *s) // insere um item com termo s e conta = 1
{
if ((mp->total != 0)&&((mp->total%BLOCK) == 0))
{
mp->lista = (Item**)realloc(mp->lista,(mp->blocos+1)*BLOCK*(sizeof(Item*)));
mp->blocos++;
}
mp->lista[mp->total] = (Item*) malloc(sizeof(Item)); // alocação dinâmica de item no mapa
if (mp->lista[mp->total] == NULL)
{
printf("Erro na alocacao de memoria\n");
exit(0);
}
strcpy(mp->lista[mp->total]->termo, s); // Insere termo s
printf("%s\n", mp->lista[mp->total]->termo);
mp->lista[mp->total]->conta++;
mp->total++; // contagem do total
}
Upvotes: 1
Views: 53
Reputation: 17
@chux thank you very much! It worked.
funcion updated:
void insere_termo (Mapa *mp, char *s) // insere um item com termo s e conta = 1 {
if ((mp->total != 0)&&((mp->total%BLOCK) == 0))
{
mp->lista = (Item**)realloc(mp->lista,(mp->blocos+1)*BLOCK*(sizeof(Item*)));
mp->blocos++;
}
mp->lista[mp->total] = (Item*) malloc(sizeof(Item)); // alocação dinâmica de item no mapa
if (mp->lista[mp->total] == NULL)
{
printf("Erro na alocacao de memoria\n");
exit(0);
}
mp->lista[mp->total]->termo = strdup(s); // Insere termo s
printf("%s\n", mp->lista[mp->total]->termo);
mp->lista[mp->total]->conta++;
mp->total++; // contagem do total
}
Upvotes: 0
Reputation: 153557
strcpy(mp->lista[mp->total]->termo, s);
fails as mp->lista[mp->total]->termo
is not yet assigned a value. Passing an uninitialized pointer p
p to strcpy(p, ...)
is undeifned behavior (UB).
Instead allocate memory, then copy with strcpy()
// strcpy(mp->lista[mp->total]->termo, s);
p->lista[mp->total]->termo = malloc(strlen(s) + 1);
strcpy(p->lista[mp->total]->termo, s);
// or
p->lista[mp->total]->termo = strdup(s);
Be sure to free memory when done.
Other problems may exist.
Upvotes: 1