Jump to content

Modificar Ficheiro em C++ / Verficar se o ficherio existe C++


Recommended Posts

Posted (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 by apocsantos
geshi
Posted

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

  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Posted (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 by apocsantos
geshi
Posted

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").

  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Posted (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 by apocsantos
geshi
Posted (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 by apocsantos
geshi

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.