Jump to content

[Dúvida] Gravar num ficheiro .txt


filipeferreira
 Share

Recommended Posts

Boa tarde,

estou batalhando a alguns dias a tentar resolver este pequeno problema, devo ser eu que não estou a fazer bem :s,

estou a começar a pouco a trabalhar com ficheiros então pedia a vossa ajudar

obrigado

void inserir(LIVRO *p, int n)
//::::::::::::::::::::::::::::::::::::::::::
{
int i;
for (i = 0; i<n && p->ocup == '1'; i++)
p++;
if (i<n)
{
fflush(stdin);
printf("\n\tQual o Titulo ? ");
scanf("%s", &p->titulo);
printf("\tQual o Autor ? ");
scanf("%s", &p->autor);
printf("\tQual a Area ? ");
scanf("%s", &p->area);
printf("\tQual o Ano ? ");
scanf("%d", &p->ano);
p->ocup = '1';

}
else
{
printf("\n\n\t Lista completa");
}
FILE *fp;
fp = fopen("arquivo.txt", "a");
if (fp == NULL){
printf("\t\t\tErro ao abrir o ficheiro");
}
for (i = 0; i<n && p->ocup == '1'; i++)
{
if (p->ocup == '1') {
fprintf(fp, "%s %s %s %d\n", p->titulo, p->autor, p->area, p->ano, p->ocup);
}
p++;
}
fclose(fp);
}

void apagar(LIVRO *p, int n)
//:::::::::::::::::::::::::::::::::::::::::::
{
   int i;
   printf("\n Qual o n: do registo do livro a apagar?");
   scanf("%d", &i);
   if (i>0 && i <= n)
       (p + i - 1)->ocup = '0';
}

Na parte do apagar não sei como poder apagar a linha que grava no meu ficheiro :/ poderia-me ajudar por favor ?

Obrigado a quem me responder

Edited by thoga31
GeSHi
Link to comment
Share on other sites

sem saber que tipos de dados estás a trabalhar é como um cego navegar numa casa desconhecia com pressa de chagar à casa de banho :

"é capaz de chagar lá, mas vai dar muitos encontrões até conseguir baixar as calças ..."

no entanto vou tentar correr na esperança de que não apareça nenhuma mesa pelo caminho :

scanf("%s", &p->titulo); // é assim que se lê uma string ??
scanf("%s", &p->autor);  // é assim que se lê uma string ??
scanf("%s", &p->area);   // é assim que se lê uma string ??
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>
#include <stdlib.h>
const int max = 8; //numero maximo de fichas
typedef struct livro {
char titulo[30];
char autor[20];
char area[20];
int ano;
char ocup;
}LIVRO;
void inicializa(LIVRO *p, int n)
//:::::::::::::::::::::::::::::::::::::
{
int i;
for (i = 0; i<n; i++)
 (p++)->ocup = '0';
}
void inserir(LIVRO *p, int n)
//::::::::::::::::::::::::::::::::::::::::::
{
int i;
for (i = 0; i<n && p->ocup == '1'; i++)
 p++;
if (i<n)
{
 fflush(stdin);
 printf("\n\tQual o Titulo ? ");
 scanf("%s", p->titulo);
 printf("\tQual o Autor ? ");
 scanf("%s", p->autor);
 printf("\tQual a Area ? ");
 scanf("%s", p->area);
 printf("\tQual o Ano ? ");
 scanf("%d", &p->ano);
 p->ocup = '1';
 FILE *fp;
 fp = fopen("arquivo.txt", "a");
 if (fp == NULL){
  printf("\t\t\tErro ao abrir o ficheiro");
 }
 for (i = 0; i<n && p->ocup == '1'; i++)
 {
  if (p->ocup == '1') {
   fprintf(fp, "\n%s  %s  %s  %d\n", p->titulo, p->autor, p->area, p->ano, p->ocup);
  }
  p++;
 }
 fclose(fp);

}
else
{
 printf("\n\n\t Lista completa");
}

}
void apagar(LIVRO *p, int n)
//:::::::::::::::::::::::::::::::::::::::::::
{
int i;
printf("\n Qual o n: do registo do livro a apagar?");
scanf("%d", &i);
if (i>0 && i <= n)
 (p + i - 1)->ocup = '0';
}
void main()
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
{
LIVRO volume[max];
LIVRO copia[max];
char opc;
int nl;
system("cls");
do
{
 printf("\nIndique o total de livros, sem exceder %d:", max);
 scanf("%d", &nl);
} while (nl<1 || nl>max);
inicializa(volume, nl);
inicializa(copia, nl);
do
{
 opc = menu();
 switch (opc)
 {
 case '1': inserir(volume, nl); break;
 case '2': apagar(volume, nl); break;
 case '3': mostrar(volume, nl); break;
 case '4': break;
 }
} while (opc != '4');
system("pause");
}

Copiei o código importante para vos mostrar melhor 🙂

Link to comment
Share on other sites

dá uma vista de olhos na consola de compilação

isto foi o que me apareceu ...

src/hhh_main.c: In function ‘inserir’:
src/hhh_main.c:47:9: warning: too many arguments for format [-Wformat-extra-args]
        fprintf(fp, "\n%s  %s  %s  %d\n", p->titulo, p->autor, p->area, p->ano, p->ocup);
        ^
src/hhh_main.c: In function ‘main’:
src/hhh_main.c:87:5: warning: implicit declaration of function ‘menu’ [-Wimplicit-function-declaration]
    opc = menu();
    ^
src/hhh_main.c:92:7: warning: implicit declaration of function ‘mostrar’ [-Wimplicit-function-declaration]
      case '3': mostrar(volume, nl); break;
      ^
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>
#include <stdlib.h>
const int max = 8; //numero maximo de fichas
typedef struct livro {
char titulo[30];
char autor[20];
char area[20];
int ano;
char ocup;
}LIVRO;
void inicializa(LIVRO *p, int n)
//:::::::::::::::::::::::::::::::::::::
{
int i;
for (i = 0; i<n; i++)
(p++)->ocup = '0';
}
char menu()
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
{
char op;
printf("\n #---------------------------------------#");
printf("\n | Inserir livro______________(1) |");
printf("\n | Apagar registo_____________(2) |");
printf("\n | Listar Livros______________(3) |");
printf("\n | Sair__________________ ____(4) |");
printf("\n #---------------------------------------#\n");
do
{
printf(" Qual a sua opcao ? ");
scanf(" %c", &op);
} while (op<'1' || op>'4');
return op;
}
void inserir(LIVRO *p, int n)
//::::::::::::::::::::::::::::::::::::::::::
{
int i;
for (i = 0; i<n && p->ocup == '1'; i++)
p++;
if (i<n)
{
fflush(stdin);
printf("\n\tQual o Titulo ? ");
scanf("%s", p->titulo);
printf("\tQual o Autor ? ");
scanf("%s", p->autor);
printf("\tQual a Area ? ");
scanf("%s", p->area);
printf("\tQual o Ano ? ");
scanf("%d", &p->ano);
p->ocup = '1';
FILE *fp;
fp = fopen("arquivo.txt", "a");
if (fp == NULL){
printf("\t\t\tErro ao abrir o ficheiro");
}
for (i = 0; i<n && p->ocup == '1'; i++)
{
if (p->ocup == '1') {
fprintf(fp, "\n%s %s %s %d\n", p->titulo, p->autor, p->area, p->ano);
}
p++;
}
fclose(fp);

}
else
{
printf("\n\n\t Lista completa");
}

}
void apagar(LIVRO *p, int n)
//:::::::::::::::::::::::::::::::::::::::::::
{
int i;
printf("\n Qual o n: do registo do livro a apagar?");
scanf("%d", &i);
if (i>0 && i <= n)
(p + i - 1)->ocup = '0';
}
void mostrar(LIVRO *p, int n)
//:::::::::::::::::::::::::::::::::::::::::
{
int i;
for (i = 0; i<n; i++)
{
if (p->ocup == '1')
printf("\n\t\t Registo n: %d \n\t\t Titulo: %s \n\t\t Autor: %s\n\t\t Area : %s \n\t\t Ano : %d", i+1,p->titulo,p->autor,p->area, p->ano);
else
printf("\nRegisto n: %d (livre)", i + 1);
p++;
}
}
void main()
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
{
LIVRO volume[max];
LIVRO copia[max];
char opc;
int nl;
system("cls");
do
{
printf("\nIndique o total de livros, sem exceder %d:", max);
scanf("%d", &nl);
} while (nl<1 || nl>max);
inicializa(volume, nl);
inicializa(copia, nl);
do
{
opc = menu();
switch (opc)
{
case '1': inserir(volume, nl); break;
case '2': apagar(volume, nl); break;
case '3': mostrar(volume, nl); break;
case '4': break;
}
} while (opc != '4');
system("pause");
}

Aqui esta o codigo completo mesmo completo, e a mim ele corre so nao consigo é apagar os dados do meu ficheiro :S

porque depois quero fazer uma função para listar os dados todos mas ficam os antigos :s e não queria que ficassem entendes me ?

PS: estou a programar em Visual Studio Ultimate

Link to comment
Share on other sites

Bem vou esperar por outra ajuda então, porque no meu compilador não dá erro nenhum sinceramente não te percebo. vou re-colar o codigo

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>
#include <stdlib.h>
const int max = 8; //numero maximo de fichas
typedef struct livro {
char titulo[30];
char autor[20];
char area[20];
int ano;
char ocup;
}LIVRO;
void inicializa(LIVRO *p, int n)
//:::::::::::::::::::::::::::::::::::::
{
int i;
for (i = 0; i<n; i++)
 (p++)->ocup = '0';
}
char menu()
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
{
char op;
printf("\n #---------------------------------------#");
printf("\n | Inserir livro______________(1) |");
printf("\n | Apagar registo_____________(2) |");
printf("\n | Listar Livros______________(3) |");
printf("\n | Sair__________________ ____(4) |");
printf("\n #---------------------------------------#\n");
do
{
 printf(" Qual a sua opcao ? ");
 scanf(" %c", &op);
} while (op<'1' || op>'4');
return op;
}
void inserir(LIVRO *p, int n)
//::::::::::::::::::::::::::::::::::::::::::
{
int i;
for (i = 0; i<n && p->ocup == '1'; i++)
 p++;
if (i<n)
{
 fflush(stdin);
 printf("\n\tQual o Titulo ? ");
 scanf("%s", p->titulo);
 printf("\tQual o Autor ? ");
 scanf("%s", p->autor);
 printf("\tQual a Area ? ");
 scanf("%s", p->area);
 printf("\tQual o Ano ? ");
 scanf("%d", &p->ano);
 p->ocup = '1';
 FILE *fp;
 fp = fopen("arquivo.txt", "a");
 if (fp == NULL){
  printf("\t\t\tErro ao abrir o ficheiro");
 }
 for (i = 0; i<n && p->ocup == '1'; i++)
 {
  if (p->ocup == '1') {
   fprintf(fp, "\n%s  %s  %s  %d\n", p->titulo, p->autor, p->area, p->ano);
  }
  p++;
 }
 fclose(fp);

}
else
{
 printf("\n\n\t Lista completa");
}

}
void apagar(LIVRO *p, int n)
//:::::::::::::::::::::::::::::::::::::::::::
{
int i;
printf("\n Qual o n: do registo do livro a apagar?");
scanf("%d", &i);
if (i>0 && i <= n)
 (p + i - 1)->ocup = '0';
}
void mostrar(LIVRO *p, int n)
//:::::::::::::::::::::::::::::::::::::::::
{
int i;
for (i = 0; i<n; i++)
{
 if (p->ocup == '1')
  printf("\n\t\t Registo n: %d \n\t\t Titulo: %s \n\t\t Autor: %s\n\t\t Area : %s \n\t\t Ano : %d", i+1,p->titulo,p->autor,p->area, p->ano);
 else
  printf("\nRegisto n: %d (livre)", i + 1);
 p++;
}
}
void main()
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
{
LIVRO volume[max];
LIVRO copia[max];
char opc;
int nl;
system("cls");
do
{
 printf("\nIndique o total de livros, sem exceder %d:", max);
 scanf("%d", &nl);
} while (nl<1 || nl>max);
inicializa(volume, nl);
inicializa(copia, nl);
do
{
 opc = menu();
 switch (opc)
 {
 case '1': inserir(volume, nl); break;
 case '2': apagar(volume, nl); break;
 case '3': mostrar(volume, nl); break;
 case '4': break;
 }
} while (opc != '4');
system("pause");
}
Link to comment
Share on other sites

no meu compilador não dá erro nenhum

não dá erro nenhum agora que corrigiste o código ...

so nao consigo é apagar os dados do meu ficheiro :S

mas a única coisa que fazes é gravar quando inseres um novo registo, como pretendes actualizar os dados no ficheiro se nada estás a fazer ?

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Pois mas é isso que pergunto como fazer para apagar os dados do ficheiro mas sim grava la os dados has de reparar ^^

Gostariam que me explicassem como faço para apagar os dados uma vez que já os consegui inserir :s

Porque se eu fizer a opcão apagar salta uma linha e volta a refazer os registos mas deixa la os antigos

queria que ao apagar, não deixa-se o antigo no ficheiro

Edited by filipeferreira
Link to comment
Share on other sites

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
 Share

×
×
  • 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.