eztia Posted June 4, 2015 at 09:29 PM Report #584300 Posted June 4, 2015 at 09:29 PM (edited) Ola, Estou fazer um programa, e nao tou conseguir fazer modificar ficheiro para o programma, que ia modificar a escolha os strings se queres ou nao modificar, mas tens escolher o aluno que vais modificar antes de modificar alguma coisa. Outrou coisa e que tou tentar por a funcionar verficar se o fichero existe ou nao. CODIGO: //Bibliotecas utilizadas #include <stdio.h> #include <stdlib.h> #include <string.h> //Se o sistema for Windows adiciona determinada biblioteca, e definindo comandos de limpar e esperar #ifdef WIN32 #include <windows.h> #define LIMPA_TELA system("cls") #endif //Máximo de bytes para uma String #define BUFFER 64 //Estrutura da lista que vai ser criada typedef struct lista { char *nome; int ano; int numero; int idade; int tele; int firstperiodo; int secondperiodo; int thirdperiodo; struct lista *proximo; } Dados; //Funções para retornar dados Dados *inicia_dados (char *nome, int ano, int numero, int idade, int tele, int firstperiodo, int secondperiodo, int thirdperiodo); //Funções do Menu void criavazia(void); //1 void deleta(void); //3 //Inicializar os dados da lista Dados *principal = NULL; //--------------------------------- // Opção '1' //--------------------------------- //Criando uma lista vazia void criavazia(void){ char *nome; int ano; int numero; int idade; int tele; int firstperiodo; int secondperiodo; int thirdperiodo; int dados; int media; FILE *fp; //Alocando dados para uma String nome = (char *)malloc(BUFFER); //Lendo String Nome fprintf(stdout, "\n\nInsere o Nome: \n----> "); scanf("%s", nome); fprintf(stdout, "\n"); //Lendo int Ano fprintf(stdout, "Insere o Ano Lectivo: \n----> "); scanf("%d", &ano); fprintf(stdout, "\n"); //Lendo int numero fprintf(stdout, "Insere o Numero na Turma: \n----> "); scanf("%d", &numero); fprintf(stdout, "\n"); //Lendo int Idade fprintf(stdout, "Insere a Idade: \n----> "); scanf("%d", &idade); fprintf(stdout, "\n"); //Lendo int tele fprintf(stdout, "Insere o numero de Telefone: \n----> "); scanf("%d", &tele); fprintf(stdout, "\n"); //Lendo int firstperiodo fprintf(stdout, "Insere a nota do Primeiro Periodo: \n----> "); scanf("%d", &firstperiodo); fprintf(stdout, "\n"); //Lendo int secondperiodo fprintf(stdout, "Insere a nota do Segundo Periodo: \n----> "); scanf("%d", &secondperiodo); fprintf(stdout, "\n"); //Lendo int thirdperiodo fprintf(stdout, "Insere a nota do Terceiro Periodo: \n----> "); scanf("%d", &thirdperiodo); fprintf(stdout, "\n"); //Lançando os dados lidos na lista Principal free(principal); principal = inicia_dados(nome, ano, numero, idade, tele, firstperiodo, secondperiodo, thirdperiodo); //Onde guardar os dados fp = fopen ("listadealunos.txt", "a"); //Como gravar os dados no ficheiro fprintf(fp, "\n--------------------------------------------------------------------\n"); fprintf(fp," Nome: %s | Ano Lectivo: %d Ano | Numero na Turma: %dN | Idade: %d Anos | Numero de Telefone: %d | Nota do Primeiro Periodo: %d | Nota do Segundo Periodo: %d | Nota do Terceiro Periodo: %d | Nota media: %d\n", nome, ano, numero, idade, tele, firstperiodo, secondperiodo, thirdperiodo, media = (firstperiodo + secondperiodo + thirdperiodo)/3); fprintf(fp, "--------------------------------------------------------------------\n"); //fecha o ficherio fclose (fp); } //Inicia os dados da lista vazia Dados *inicia_dados(char *nome, int ano, int numero, int idade, int tele, int firstperiodo, int secondperiodo, int thirdperiodo) { Dados *novo; //Alocando memoria para a posicao atual da lista novo = (Dados *)malloc(sizeof(Dados)); //Lanca os dados lidos novo->nome = (char *)malloc(strlen(nome)+1); strncpy(novo->nome, nome, strlen(nome)+1); novo->ano = ano; novo->numero = numero; novo->idade = idade; novo->tele = tele; novo->firstperiodo = firstperiodo; novo->secondperiodo = secondperiodo; novo->thirdperiodo = thirdperiodo; //Aponta para a proxima posicao da lista novo->proximo = NULL; return novo; } //--------------------------------- // FIM DE OPCAO '1' //--------------------------------- //--------------------------------- // Opcao '2' //--------------------------------- void mostrar() {char str[70]; FILE *p; if((p=fopen("listadealunos.txt","r"))==NULL){ printf("\nUnable t open file string.txt"); return 0; } while(fgets(str,70,p)!=NULL) puts(str); fclose(p); getch(); return 0; } //--------------------------------- // FIM DE OPCAO '2' //--------------------------------- //--------------------------------- // Opcao '3' //--------------------------------- //Eliminhar Lista void deleta(void) { int ret; FILE *fp; //Onde elimnar a lista char filename[] = "listadealunos.txt"; fp = fopen(filename, "w"); fclose(fp); //Funcao para remover a lista ret = remove(filename); printf("ELIMINADO COM SUCESSO!!"); getch(); return 0; } //--------------------------------- // FIM DE OPCAO '3' //--------------------------------- //--------------------------------- // Opcao '4' //--------------------------------- void linhas(void) { char url[]="listadealunos.txt", ch; int num=0; FILE *arq; arq = fopen(url, "r"); if(arq == NULL) printf("Nao Existe ficheiro\n"); else while( (ch=fgetc(arq))!= EOF ) if(ch == '\n') num++; printf("Existem %d linhas no arquivo\n", num); fclose(arq); getch(); return 0; } //--------------------------------- // FIM DE OPCAO '4' //--------------------------------- //--------------------------------- // OPCAO '5' //--------------------------------- void backups(void) { char ch, source_file[20], target_file[20]; FILE *source, *target; source = fopen("listadealunos.txt","r"); if( source == NULL ) { printf("Press any key to exit...\n"); exit(EXIT_FAILURE); } printf("Backing Up ListadeAlunos.txt to listadeAlunos_Backup.txt\n"); gets(target_file); target = fopen("listadealunos_Backup.txt", "w"); if( target == NULL ) { fclose(source); printf("Press any key to exit...\n"); exit(EXIT_FAILURE); } while( ( ch = fgetc(source) ) != EOF ) fputc(ch, target); printf("File copied successfully.\n"); fclose(source); fclose(target); getch(); return 0; } //--------------------------------- // FIM DE OPCAO '5' //--------------------------------- //--------------------------------- // Opcao '6' //--------------------------------- //Eliminhar Lista void deletabackup(void) { int ret; FILE *fp; //Onde elimnar a lista char filename[] = "listadealunos_backup.txt"; fp = fopen(filename, "w"); fclose(fp); //Funcao para remover a lista ret = remove(filename); printf("ListadeAlunos_Backup ELIMINADO COM SUCESSO!!"); getch(); return 0; } //--------------------------------- // FIM DE OPCAO '6' //--------------------------------- //--------------------------------- // FIM DE OPCAO '7' //--------------------------------- void pesquisapasta(void) { FILE *fp; FILE *pt; /* Abrir o Ficheiro */ fp = fopen("listadealunos.txt","r"); pt = fopen("listadealunos_backup.txt","r"); /* Verificar se a abertura foi feita com sucesso */ if (fp==NULL) printf("Ficheiro \"ListadeAlunos\" Nao Existe\n"); else{ printf("Ficheiro \"ListadeAlunos\" Existe!!!\n"); fclose(fp); } if (pt==NULL) printf("Ficheiro \"ListadeAlunos_Backup\" Nao Existe\n"); else{ printf("Ficheiro \"ListadeAlunos_Backup\" Existe!!!\n"); fclose(pt); } getch(); return 0; } //--------------------------------- // FIM DE OPCAO '7' //--------------------------------- //--------------------------------- // OPCAO '8' //--------------------------------- void vaziotest(void){ FILE *fp; fp = fopen("listadealunos.txt","r"); // need to make sure the file is not empty, error case. if (fp == NULL){ printf("Lista Vazio"); } // if the file is empty, print an empty line. int size = ftell(fp); if (size == 0){ printf("\n"); } printf("Lista nao esta Vazio",size); } //--------------------------------- // FIM DE OPCAO '8' //--------------------------------- //--------------------------------- // OPCAO '9' //--------------------------------- void tamanho(void){ FILE *fp; // ponteiro para o arquivo long tamanho; // tamanho em bytes do arquivo fp = fopen("listadealunos.txt","r"); // verifica se o arquivo foi aberto com sucesso if (fp != NULL) { // movimenta a posição corrente de leitura no arquivo para o seu fim fseek(fp, 0, SEEK_END); // pega a posição corrente de leitura no arquivo tamanho = ftell(fp); // imprime o tamanho do arquivo printf("O Tamnho do Ficherio e %ld bytes", tamanho); } else { printf("Arquivo inexistente"); } getch(); return 0; } //--------------------------------- // FIM DE OPCAO '9' //--------------------------------- //--------------------------------- // Função Main //--------------------------------- int main(void) { char escolha; int chave=0; //Laço que ia mostrar o menu quando carregas numa opção (char) do { //Limpando a tela, e mostrando o menu lembrando que primeiramente, os itens estão bloqueados até que seja criada uma lista vazia LIMPA_TELA; fprintf(stdout, "\n\t\tInformacao dos Alunos\n\n"); fprintf(stdout, "Escolha uma opcao: \n"); fprintf(stdout, "1 - Criar Ficheiro / Inserir no Ficheiro\n"); fprintf(stdout, "2 - Mostrar todos os valores no ficheiro\n"); fprintf(stdout, "3 - Eliminar Ficheiro\n"); fprintf(stdout, "4 - Numero de linhas no ficheiro\n"); fprintf(stdout, "5 - Backup do ficheiro\n"); fprintf(stdout, "6 - Eliminha o ficheiro Backup\n"); fprintf(stdout, "7 - Verificar se o Ficheiro Existe\n"); fprintf(stdout, "8 - Verificar se o Ficheiro esta Vazio\n"); fprintf(stdout, "9 - Tamnaho do Ficheiro\n"); fprintf(stdout, "0 - Sair\n\n"); fprintf(stdout, "Resposta: "); scanf("%c", &escolha); //Se a chave for diferente de zero, porem a escolha for diferente de 1, 4 e d, a escolha será z (opção inválida) switch(escolha) { //Criando lista vazia case '1': criavazia(); break; //Exibindo todos elementos case '2': mostrar(); break; //Elimina ultimo elemento case '3': deleta(); break; //Quantos linhas case '4': linhas(); break; //Backup do fichiero case '5': backups(); break; //Eliminhar Backup do fichiero case '6': deletabackup(); break; //Back up do fichiero case '7': pesquisapasta(); break; //Verifica se o fichiero esta vazio ou nao case '8': vaziotest(); break; //Tamnaho do ficheiro case '9': tamanho(); break; //Saindo e finalizando o programa case '0': fprintf(stderr,"Obrigado por utilizar esse programa!\n"); fprintf(stderr,"------>Terminal de Informacao<------\n\n"); exit(0); break; //Se for algum valor invalido default: fprintf(stderr,"Digite uma opcao valida pressione (-Enter-)!\n"); getchar(); break; } //Impedindo lixo na gravação da escolha getchar(); } while (escolha > 0); //Loop Infinito return 0; } Edited June 5, 2015 at 10:13 AM by apocsantos geshi
HappyHippyHippo Posted June 4, 2015 at 09:38 PM Report #584302 Posted June 4, 2015 at 09:38 PM ora bem - o código é C e não C++ - é impossivel ler esse código por faltar as tags do GeSHi assim como a falta completa de indentação - a descrição do problema é completamente ilegível - apresentas linhas e einhas de código à espera que uma pessoa saiba o que procurar ... acho que vai ser difícil te ajudar 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
eztia Posted June 4, 2015 at 10:12 PM Author Report #584306 Posted June 4, 2015 at 10:12 PM (edited) Quero que isto diz me se o ficherio ja existe ou nao Mas o problema e quando eu utilizou este codigo isto so mostra quando lista nao esta vazio Code: void vaziotest(void){ FILE *fp; fp = fopen("listadealunos.txt","r"); // need to make sure the file is not empty, error case. if (fp == NULL){ printf("Lista Vazio"); } // if the file is empty, print an empty line. int size = ftell(fp); if (size == 0){ printf("\n"); } printf("Lista nao esta Vazio",size); } Edited June 5, 2015 at 10:14 AM by apocsantos geshi
HappyHippyHippo Posted June 5, 2015 at 07:19 AM Report #584316 Posted June 5, 2015 at 07:19 AM um ficheiro sem nada não é a mesma coisa que um ficheiro que não existe tens de verificar as seguintes situações: - ficheiro existe >> Lista vazia - ficheiro vazio >> lista vazia - ficheiro não vazio >> lista não vazia o teu problema é que ao abrires o ficheiro com o parâmetro de leitura ("r"), está a colocar o ponteiro interno do stream na primeira posição do ficheiro (como se fosses começar a ler-lo) deverias obrigar a colocar na última posição. isso pode ser feito através do fssek, ou (muito melhor) abrires com o parâmetro de incremento do stream ("a"). 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
eztia Posted June 5, 2015 at 04:45 PM Author Report #584361 Posted June 5, 2015 at 04:45 PM (edited) Muito Obrigado Outro coisa que eu nao tou conseguir nada de e criar um funcao que introduzes um nome de um aluno e le esse valor no ficheiro e mostrar tudos os alunos com esse nome e os dados deles. Utilizando este formato quando mostra os dados dos alunos com essa nome //Onde guardar os dados fp = fopen ("listadealunos.txt", "a"); //Como gravar os dados no ficheiro fprintf(fp, "\n--------------------------------------------------------------------\n"); fprintf(fp," Nome: %s %s\n", nome, apelido); fprintf(fp," Turma: %d%c %s\n", ano, 167, turma); fprintf(fp," Numero na Turma: N:%d%c\n", numero, 167); fprintf(fp," Data de Nascimento: %d %s %d\n", dianes, mesnes, anones); fprintf(fp," Numero de Telefone: %d\n", tele); fprintf(fp," Morada: Rua.%s N:%d, %s, %s, %s\n", rua, porta, localidade, concelho, distrito); fprintf(fp," %s\n", pais); fprintf(fp," %s\n", codigopostal); fprintf(fp," Nota do Primeiro Periodo: %d\n", firstperiodo); fprintf(fp," Nota do Segundo Periodo: %d\n", secondperiodo); fprintf(fp," Nota do Terceiro Periodo: %d\n", thirdperiodo); fprintf(fp," Nota media: %d\n", media = (firstperiodo + secondperiodo + thirdperiodo)/3); fprintf(fp, "--------------------------------------------------------------------\n"); Edited June 5, 2015 at 05:27 PM by apocsantos geshi
HappyHippyHippo Posted June 5, 2015 at 09:53 PM Report #584375 Posted June 5, 2015 at 09:53 PM vou assumir que todas (mesmo todas) as strings que estás a gravar no ficheiro não possuem espaços, então basta trocar os fprintf's por fscanf's e alterar os parâmetros de onde vais gravar os dados IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
eztia Posted June 6, 2015 at 01:39 PM Author Report #584390 Posted June 6, 2015 at 01:39 PM Entao para pesquisar um aluno com o nome , Basta criar fscanfs apontar por o ficheiro e faz ? Nao tou preceber bem Obrigado
eztia Posted June 6, 2015 at 06:57 PM Author Report #584396 Posted June 6, 2015 at 06:57 PM (edited) Fiz este codigo mas nao funciona para incerir o nome de pessoa e mostrar os dados. void searchdados(void) { Dados *dados; char *chave; int achou = 0; fprintf(stdout, "Lista:\n\n"); //Percorrendo todas as posições FILE *fp; fp = fopen("listadealunos.txt","a"); for (; dados != NULL; dados = dados->proximo) { //Se encontrou, mostra os dados if (strcmp(chave, dados->nome) == 0) { fprintf(fp, "------------------------\n"); fprintf(stdout, "Nome: %s\n", dados->nome); fprintf(stdout, "Idades: %d\n", dados->idade); } } //Mostrando o resultado da busca if (achou == 0) fprintf(stdout, "Nenhum resultado encontrado.\n"); else fprintf(stdout, "Foram encontrado(s) %d registro(s).\n", achou); getch(); return 0; } Edited June 6, 2015 at 07:24 PM by apocsantos geshi
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now