listakpostal-27 programa em c encaminhado segunda vez

1. listakpostal-27 programa em c encaminhado segunda vez

Jonny Ernani Maia
maia99

(usa Debian)

Enviado em 26/12/2011 - 23:50h

#include <stdio.h>
#include <stdlib.h>

#define MAX 100

struct addr{
char name[30];
char street[40];
char city[20];
char state[3];
unsigned long int zip;
} *addr_info;

int init_list(void);
int enter(void);
int delete(void);
int list(void);
int menu_select(void);
int find_free(void);

int main(void)
{

inicia();
printf("Legal heim\n\n\n");
system("color 2e");
char choice;
int init_list();// Iniciliaza a matriz de estruturas
for(;;) {
choice=menu_select();
switch(choice) {
case 1: enter();
break;
case 2: delete();
break;
case 3: list();
break;
case 4: exit(0);
case 5: salva();
}
}
}
//Inicializa a lista
int init_list(void)
{
register int t;
for(t=0; t<MAX; t++)
addr_info[t].name[0] = '{TTEXTO}';
}
//Otem a sele&#65533;&#65533;o
int menu_select(void)
{
char s[80];
int c;
printf("1. Inserir um nome\n\n");
printf("2. Excluir um nome \n\n");
printf("3. Listar o arquivo \n\n");
printf("4. Sair\n\n");
printf("5. Salvar Registros\n\n");
do{
printf("Digite sua escolha:____");
scanf("%c",(s));
c = atoi(s);
}while(c<0 || c>5);
return c;
}
//Insere os endere&#65533;os na lista.
int enter(void)
{
int slot;
char s[80];
slot = find_free();
if(slot==-1) {
printf("Lista cheia\n\n");
return;
}
printf("Digite o nome: \n\n");
scanf("%c",(addr_info[slot].name));
printf("Digite a rua: \n\n");
scanf("%c",(addr_info[slot].street));
printf("Digite a cidade: \n\n");
scanf("%c",(addr_info[slot].city));
printf("Digite o Estado: \n\n");
scanf("%c",(addr_info[slot].state));
printf("Digite o CEP: \n\n");
scanf("%c",(s));
addr_info[slot].zip = strtoul(s, '{TTEXTO}', 10);
}
//Encontra um estrutura n&#65533;o usada
int find_free(void)
{
register int t;
for(t=0;addr_info[t].name[0] && t<MAX; t++)
if(t==MAX) return -1; //nenyhum elemento livre
return t;
}


/* int procura(char nome[])
{
register int t;
for(t=0; t < MAX; t++){
if(strcmp(nome, addr_info.name[t])
return t;
}
return -1;
} */


//Apaga um endere&#65533;o
int delete(void)
{
register int slot;
char s[80];
printf(" Digite o registro #:\\n\n");
slot = atoi(s);
if(slot>=0 && slot < MAX)
addr_info[slot].name[0]= '{TTEXTO}';
}
//Mostra lista na tela
int list(void)
{
register int t;
for(t=0; t<MAX; ++t){
if(addr_info[t].name[0]){
printf("---------------------------------\n");
printf("%s \n\n\n", addr_info[t].name);
printf("%s \n\n\n", addr_info[t].street);
printf("%s \n\n\n", addr_info[t].city);
printf("%s\n\n\n", addr_info[t].state);
printf("%lu\n\n\n", addr_info[t].zip);

system("sleep 4");
}

}
printf("\n\n");

}

int salva(void){
FILE *dadosHd;

dadosHd = fopen("dados.dat", "r+");

fwrite(addr_info, sizeof(struct addr), MAX, dadosHd);

fclose(dadosHd);

return 0;
}

int inicia(void){
FILE *dadosHd;

dadosHd = fopen("dados.dat", "r+");
addr_info = malloc(sizeof(struct addr) * MAX);
fread(addr_info, sizeof(struct addr), MAX, dadosHd);
printf("%d ------------------<\n", sizeof(struct addr));
printf("nome - %s\n", addr_info[0].name);

fclose(dadosHd);

return 0;
}

Senhores agradeço desde já, voces fazem um excelente trabalho. Parabéns. Por favor me ajudem, eu ficarei muito grato. Postarei sem dúvidas quando der certo. Para que todos possam entender e conhecer. Muito obrigado. Devo esta aos senhores.
Jonny maia. fone 91861492 .Gostaria de conhece-los pessoalmente.
Muito obrigado.



  


2. Re: listakpostal-27 programa em c encaminhado segunda vez

Marcelo Utikawa da Fonseca
utikawa

(usa Ubuntu)

Enviado em 29/12/2011 - 13:35h

O arquivo dados.dat existe? Quando é utilizado o modo "r+" o arquivo não é criado.
Se ele não existir, o retorno de fopen será nulo.
Como seu programa não checa se ele é nulo poderá ocorrer o erro "segmentation fault" pois a função fread a seguir terá recebido NULL como ponteiro para o arquivo a ser lido.
Quando o programa é executado, aparece alguma mensagem antes de segmentation fault?
E esse erro é de lógica, não de sintaxe. Esse é o motivo de o compilador não gerar erro.


3. RESOLVIDO - listapostal.c - falha de segmentacao

Jonny Ernani Maia
maia99

(usa Debian)

Enviado em 15/01/2012 - 18:44h




4. RESOLVIDO - listapostal.c - falha de segmentacao

Jonny Ernani Maia
maia99

(usa Debian)

Enviado em 15/01/2012 - 18:57h


Senhores deste forum, VIVA O LINUX. É com satisfação que eu, anexo o RESULTADO do arquivo listapostal.c . "falha de segmentaçao". Abaixo segue o arquivo completo e corrigido. Quero deixar a minha adimiração e respeito, pelo profissional: Marecelo Utikawa Fonseca. Pois este amigo me deu uma grande oportuindade de aprender e conhecer este recurso em linguagem C. Pois ele congrega um grande conhecimento e de uma didática extraordinária. Quero tambem contribuir. Como escreveu o Marcelo, quando nós passamos o conhecimento para duas pessoas, acaba que o conhecimento é passado integralmente e nos tornamos multiplicadores do saber.

Muito obrigado.

Jonny Ernai Maia.





#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdio_ext.h> // Para __fpurge

#define MAX 100

struct addr {
char name [30];
char street[40];
char city [20];
char state [3];
unsigned long int zip;
} *addr_info;

// Funcao para leitura de uma string de tamanho n
void LerString(char *txt, int n)
{
// Descarrega o buffer e faz a leitura de string
__fpurge(stdin);
fgets(txt, n, stdin);

// Procura por quebras de linha, espacos ou tab no final da string, removendo-os
n = strlen(txt) - 1;
while(txt[n] == '\n' || txt[n] == '\r' || txt[n] == ' ' || txt[n] == '\t')
txt[n--] = 0;
}

//Otem a seleção
int menu_select(void)
{
char s[80];

printf("1. Inserir um nome\n\n");
printf("2. Excluir um nome \n\n");
printf("3. Listar o arquivo \n\n");
printf("4. Salvar Registros\n\n");
printf("5. Sair\n\n");

printf("Digite sua escolha:____");
LerString(s, sizeof(s));
return atoi(s);
}

//Encontra um estrutura não usada
int find_free(void)
{
int t;

for(t=0;addr_info[t].name[0] && t<MAX; t++);

if(t==MAX)
return -1; //nenyhum elemento livre

return t;
}

//Insere os endereços na lista.
void enter(void)
{
int slot;
char s[80];

slot = find_free();
if(slot==-1) {
printf("Lista cheia\n\n");
return;
}

printf("Digite o nome: \n\n");
LerString(addr_info[slot].name, sizeof(addr_info[slot].name));
printf("Digite a rua: \n\n");
LerString(addr_info[slot].street, sizeof(addr_info[slot].street));
printf("Digite a cidade: \n\n");
LerString(addr_info[slot].city, sizeof(addr_info[slot].city));
printf("Digite o Estado: \n\n");
LerString(addr_info[slot].state, sizeof(addr_info[slot].state));
printf("Digite o CEP: \n\n");
LerString(s, sizeof(s));

addr_info[slot].zip = strtoul(s, 0, 10);
}

int procura(char *nome)
{
int t;

for(t=0; t < MAX; t++){
if(!strcmp(nome, addr_info[t].name))
return t;
}

return -1;
}

//Apaga um endereço
void delete(void)
{
int slot;
char s[80];

printf(" Digite o registro #:\\n\n");
slot = atoi(s);
if(slot>=0 && slot < MAX)
addr_info[slot].name[0]= 0;
}

//Mostra lista na tela
void list(void)
{
int t;
for(t=0; t<MAX; ++t){
if(addr_info[t].name[0]){
printf("---------------------------------\n");
printf("%s \n", addr_info[t].name);
printf("%s \n", addr_info[t].street);
printf("%s \n", addr_info[t].city);
printf("%s \n", addr_info[t].state);
printf("%lu\n", addr_info[t].zip);

if(t && !(t%5))
sleep(4);
}
}

printf("\n\n");
}

int salva(void){
FILE *dadosHd;

dadosHd = fopen("dados.dat", "wb");

fwrite(addr_info, sizeof(struct addr), MAX, dadosHd);
fclose(dadosHd);

return 0;
}

void inicia(void){
FILE *dadosHd;

addr_info = malloc(sizeof(struct addr) * MAX);

dadosHd = fopen("dados.dat", "rb");

if(dadosHd != NULL) {
fread(addr_info, sizeof(struct addr), MAX, dadosHd);

printf("%ld ------------------<\n", sizeof(struct addr));
printf("nome - %s\n", addr_info[0].name);

fclose(dadosHd);
} else {
memset(addr_info, 0, sizeof(struct addr) * MAX);
printf("Arquivo inexistente\n");
}
}

int main(void)
{
char choice;

inicia();

printf("Legal heim\n\n\n");

for(;;) {
choice=menu_select();
switch(choice) {
case 1: enter();
break;
case 2: delete();
break;
case 3: list();
break;
case 4: salva();
break;
case 5: exit(0);
break;
default:
printf("Opcao invalida!\n");
}
}
}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts