Enviado em 05/06/2021 - 23:26h
Prof. Paulo1265, antes muito obrigado pela sua ajuda, preciso de mais uma ajuda. Estou trabalhando com o linux - ubuntu 18.04.10. Quando eu compilo o programa listapostal62.c (gcc listacanastra.c -o listacanastra. exe) , não mostra nenhum erro, mas quando executo ./listacanastra.exe, preenhco o programa e quando escecuto o gedit o arquivo (disco) gargoli.txt ele mostra o arquivo com caracteres invalidso em VERMELHO. (CODIFUTF8) , invalido.#include <stdio.h>
#include <ctype.h> // Para toupper
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdio_ext.h> // Para __fpurge
#define MAX 2
# define LISTA_TELA 0
# define LISTA_ARQUIVO 1
// Variavel que indica se a lista foi modificada e nao salva
int nao_salvo = 0;
struct addr {
char name[30];
char street[40];
char city[20];
char state[3];
long 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;
}
// Funcao para validar uma string como CEP. Retorna o cep ou -1 se invalido
long ValidaCEP(char * cep)
{
int i;
// Para ser um cep, a string deve conter 8 (se nao fornecido o hifen) ou 9 caracteres.
if (strlen(cep) == 9 && cep[5] == '-') {
// CEP com hifen. Vamos remove-lo.
for (i = 5; i < 9; i++) {
cep[i] = cep[i + 1];
}
} else if (strlen(cep) != 8) {
return -1; // CEP invalido
}
// Verifica se todos os caracteres sao numericos
for (i = 0; i < 8; i++) {
if (cep[i] < '0' || cep[i] > '9')
return -1; // Encontrado caracter nao numerico, cep invalido.
}
// Se o programa chegou ate aqui, indica que temos um cep valido. Basta retornarmos o cep convertido para long int
return atol(cep);
}
void CarregaCEP(char * cep_txt, int cep_num)
{
int cep_alto, cep_baixo;
cep_alto = cep_num / 1000;
cep_baixo = cep_num - (cep_alto * 1000);
sprintf(cep_txt, "%05d-%03d", cep_alto, cep_baixo);
}
//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. Exportar como Texto\n\n");
printf("6. 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;
}
nao_salvo = 1;
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));
do {
printf("Digite o CEP: \n\n");
LerString(s, sizeof(s));
addr_info[slot].zip = ValidaCEP(s);
if (addr_info[slot].zip < 0) {
printf("CEP invalido!\n");
}
} while (addr_info[slot].zip < 0);
}
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() {
int slot;
char s[80];
printf(" Digite o registro #:\n\n");
LerString(s, sizeof(s));
slot = atoi(s);
if (slot >= 0 && slot < MAX) {
addr_info[slot].name[0] = 0;
nao_salvo = 1;
}
}
//Mostra lista na tela
void list(int tipo)
{
int t;
FILE * saida;
char txt[10];
if (tipo == LISTA_TELA) {
saida = stdout;
} else {
saida = fopen("gargoli.txt", "w");
if (saida == NULL) {
printf("Erro abrindo arquivo!\n");
}
}
for (t = 0; t < MAX; ++t) {
if (addr_info[t].name[0]) {
fprintf(saida, "---------------------------------\n");
fprintf(saida, "Registro %d\n", t);
fprintf(saida, "%s \n", addr_info[t].name);
fprintf(saida, "%s \n", addr_info[t].street);
fprintf(saida, "%s \n", addr_info[t].city);
fprintf(saida, "%s \n", addr_info[t].state);
CarregaCEP(txt, addr_info[t].zip);
fprintf(saida, "%s \n", txt);
if (tipo == LISTA_TELA && t && !(t % 5))
sleep(4);
}
}
fprintf(saida, "\n\n");
if (tipo == LISTA_ARQUIVO) {
fclose(saida);
}
}
int salva(void) {
FILE * dadosHd;
dadosHd = fopen("gargoli.txt", "w");
fwrite(addr_info, sizeof(struct addr), MAX, dadosHd);
fclose(dadosHd);
nao_salvo = 0;
return 0;
}
void inicia(void) {
FILE * dadosHd;
addr_info = malloc(sizeof(struct addr) * MAX);
dadosHd = fopen("gargoli.txt", "w");
if (dadosHd != NULL) {
fread(addr_info, sizeof(struct addr), MAX, dadosHd);
printf("%d ------------------<\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(LISTA_TELA);
break;
case 4:
salva();
break;
case 5:
list(LISTA_ARQUIVO);
break;
case 6:
if (nao_salvo) {
printf("Lista nao salva desde a ultima modificacao! Sair mesmo assim? (S/N): ");
if (toupper(getchar()) != 'S') // Nao confirmou, continuar o programa.
break;
}
exit(0);
break;
default:
printf("Opcao invalida!\n");
}
}
}
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Melhores Práticas de Nomenclatura: Pastas, Arquivos e Código [RESOLVID... (4)
Recuperar arquivos de HD em formato RAW usando Linux (0)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta