Question:
I'm relatively new to the field of programming and I'm making a program in which I need to read a file with 10 records with 4 fields (records with a fixed length of 60 and with a variable size for each field). However, I'm having difficulties because I've done all the logic in the program and it looks okay but when I run it I encounter an error in a print ([Error] subscripted value is neither array nor pointer nor vector). However, even when I comment this print to see if the rest of the program works, when I run it it gives an 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!
Answer:
First, you changed line 88 with line 89, it 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 nu
-sized integer vector and you actually want to call an integer variable called num
and not a vector. Apart from that I think everything is correct. If you don't 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] = '\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);
}