Problems with program that should read log file with variable-length field

3

I'm relatively new to the programming area and I'm doing a program where I need to read a file with 10 records with 4 fields (records of fixed size 60 and 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 encounter an error in a print ([Error] subscripted value is neither array nor pointer nor vector). However, even when I comment on this print to see if the rest of the program works, when I run it it gives error and closes. Here 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] = '
#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] = '%pre%';              //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] = '%pre%';
                strcpy((*myreg).nome, vet);
                k=0;
            }

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

            if (contTemporario == 3){
                vet[k] = '%pre%';
                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);
}
'; //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] = '%pre%'; strcpy((*myreg).nome, vet); k=0; } if (contTemporario == 2){ vet[k] = '%pre%'; strcpy((*myreg).sobrenome, vet); k=0; } if (contTemporario == 3){ vet[k] = '%pre%'; 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); }

Thank you in advance!

    
asked by anonymous 21.08.2016 / 14:15

1 answer

1

First you changed line 88 and 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 an integer vector of size nu and you actually want to call an integer variable called num and not a vector. Otherwise, I think everything is correct. If you do not understand something ask. Code corrected 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] = '
#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] = '%pre%';              //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] = '%pre%';
            strcpy((*myreg).nome, vet);
            k=0;
        }

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

        if (contTemporario == 3){
            vet[k] = '%pre%';
            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);
}
'; //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] = '%pre%'; strcpy((*myreg).nome, vet); k=0; } if (contTemporario == 2){ vet[k] = '%pre%'; strcpy((*myreg).sobrenome, vet); k=0; } if (contTemporario == 3){ vet[k] = '%pre%'; 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); }
    
21.08.2016 / 21:57