Problems with a program that must read a registry file with a variable size field

Asked

Viewed 141 times

3

I am relatively beginner in the programming area and I am doing a program where I need to read a file with 10 records with 4 fields (records of fixed size 60 and with size of each variable field). However, I am having difficulties because I did all the logic of the program and it seems correct but when I run I find an error in a print ([Error] subscripted value is neither array nor Pointer vector). However, even when I comment this print to see if the rest of the program works, when I run it gives error and closes. Below is the program:

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

int main (){
    struct fixo{
        char nome[15];
        char sobrenome[15];
        char rua [26];
        int num;    
    };

    struct fixo myreg[50];

    char ch;        //alocar caracteres do registro
    char vet[15];   //vetor temporario
    FILE *arq;      //arquivo
    int i;
    int contTemporario=0;   //contador de pipelines
    int var;            //contador do tamanho do registro
    int nu;             //numero que o usuario vai entrar
    int n;              //contador de caracteres do while
    int k=0;            //contador do vetor temporario
    //int contTemp2=1;  //contador para printar
    int temp;   //inteiro temporario

    if ((arq=fopen("campo_var_reg_fixo.dad", "rb"))==NULL){
        printf ("Erro ao abrir o arquivo!\n");
        getch();
        return (0);
    }

    while (fread(&ch,sizeof(char),1,arq)){  //ler char por char

        if (ch == '|'){                     //se achar um pipeline, quer dizer que eh um campo do registro
            contTemporario++;               //contador de pipelines aumenta

            if (contTemporario == 4){       //primeiro testando a condição caso for 4 pipelines, ou seja, o fim de um registro
                vet[k] = '\0';              //assimilar o espaço do pipeline do campo para o caracter nulo no vetor
                (*myreg).num = atoi(vet);   //o vetor será então o campo do registro
                k=0;                        //zera contador do vetor
                contTemporario = 0;         //zera contador temporario de pipelines
                var = abs(59-n);            //guarda quantos caracteres faltam para acabar o registro atual
                for (i=0; i<var; i++){
                    fread(&ch,sizeof(char),1,arq);
                }
                n = 0;                      //n eh o contador de caracteres de cada registro
                printf ("\n");
                continue;                   //pula para proxima iteração do while
            }

            if (contTemporario == 1){
                vet[k] = '\0';
                strcpy((*myreg).nome, vet);
                k=0;
            }

            if (contTemporario == 2){
                vet[k] = '\0';
                strcpy((*myreg).sobrenome, vet);
                k=0;
            }

            if (contTemporario == 3){
                vet[k] = '\0';
                strcpy((*myreg).rua, vet);
                k=0;
            }   
         }

        else {
            vet[k] = ch;        //coloca o caracter que leu no vetor
            k++;    
        }

    printf ("%c", ch);
    n++;
}

    while ((nu>10)||(nu<1)){
        printf ("\nDigite um numero entre 1 e 10: ");
        scanf ("%d", &nu); 
    }

    printf ("\nNome: ", (*myreg).rua[nu]);
    printf ("\nSobrenome: %s", (*myreg).sobrenome[nu]);
    printf ("\nNumero: %s", (*myreg).rua[nu]);
    printf ("\nRua: %d", (*myreg).num[nu]); //esse é o print que da erro!
    getch();
    fclose(arq);
}

Thanks in advance!

1 answer

2


First you switched the line 88 with the 89 is printing street number and street number. 88: printf ("\nNumero: %s", (*myreg).rua[nu]); and 89: printf ("\nRua: %d", (*myreg).num[nu]); //esse é o print que da erro!.You in (*myreg).num[nu] you are calling a vector of integers of size nu and you actually want to call an entire variable called num and not a vector. Other than that I think it’s all right. If you don’t understand something ask. Corrected code below:

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

int main (){
  struct fixo{
    char nome[15];
    char sobrenome[15];
    char rua [26];
    int num;    
};

struct fixo myreg[50];

  char ch;        //alocar caracteres do registro
  char vet[15];   //vetor temporario
  FILE *arq;      //arquivo
  int i;
  int contTemporario=0;   //contador de pipelines
  int var;            //contador do tamanho do registro
  int nu;             //numero que o usuario vai entrar
  int n;              //contador de caracteres do while
  int k=0;            //contador do vetor temporario
  //int contTemp2=1;  //contador para printar
  int temp;   //inteiro temporario

  if ((arq=fopen("campo_var_reg_fixo.dad", "rb"))==NULL){
      printf ("Erro ao abrir o arquivo!\n");
      getch();
    return (0);
  }

  while (fread(&ch,sizeof(char),1,arq)){  //ler char por char

    if (ch == '|'){                     //se achar um pipeline, quer dizer que eh um campo do registro
        contTemporario++;               //contador de pipelines aumenta

        if (contTemporario == 4){       //primeiro testando a condição caso for 4 pipelines, ou seja, o fim de um registro
            vet[k] = '\0';              //assimilar o espaço do pipeline do campo para o caracter nulo no vetor
            (*myreg).num = atoi(vet);   //o vetor será então o campo do registro
            k=0;                        //zera contador do vetor
            contTemporario = 0;         //zera contador temporario de pipelines
            var = abs(59-n);            //guarda quantos caracteres faltam para acabar o registro atual
            for (i=0; i<var; i++){
                fread(&ch,sizeof(char),1,arq);
            }
            n = 0;                      //n eh o contador de caracteres de cada registro
            printf ("\n");
            continue;                   //pula para proxima iteração do while
        }

        if (contTemporario == 1){
            vet[k] = '\0';
            strcpy((*myreg).nome, vet);
            k=0;
        }

        if (contTemporario == 2){
            vet[k] = '\0';
            strcpy((*myreg).sobrenome, vet);
            k=0;
        }

        if (contTemporario == 3){
            vet[k] = '\0';
            strcpy((*myreg).rua, vet);
            k=0;
        }   
     }

    else {
        vet[k] = ch;        //coloca o caracter que leu no vetor
        k++;    
    }

    printf ("%c", ch);
    n++;
}

   while ((nu>10)||(nu<1)){
      printf ("\nDigite um numero entre 1 e 10: ");
      scanf ("%d", &nu); 
}

      printf ("\nNome: %s", (*myreg).nome[nu]); // Linha Corrigida: coloquei %s e troquei rua por nome
      printf ("\nSobrenome: %s", (*myreg).sobrenome[nu]);
      printf ("\nNumero: %d", (*myreg).num);  // Linha Corrigida: troquei %s por %d e rua por num e tirei os [] pois num é um inteiro e não um vetor de inteiros
      printf ("\nRua: %s", (*myreg).rua[nu]); //Linha Corrigida: troquei %d por %s e num por rua
      getch();
      fclose(arq);
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.