Ir ao conteúdo
  • Cadastre-se

Duvidas com manipulação de arquivo txt.


Ofioneu
Ir à solução Resolvido por Ofioneu,

Posts recomendados

Olá, os senhores(as) podem me ajudar com o erro ao copilar esse arquivo: (estou tentando fazer um programa que pede que o usuário digite dois numeros e a soma dos mesmos seja salva em um arquivo texto, porém tambem estou implementando um menu com listar e sair..)

 

#include <stdio.h>
#include <stdlib.h>
 
FILE *abre( char modo, char caminho[1000]){
FILE *arquivo;
switch(modo){
case 'g':
arquivo=fopen(caminho, "wt");
break;
case 'l':
arquivo=fopen(caminho, "rt");
break;
case 'a':
arquivo = fopen(caminho, "a");
}
if(arquivo==NULL){     
        printf("Nao foi possivel abrir o arquivo\n");
        exit(0);
    }
    return arquivo;
}
 
void fechar(FILE *arquivo){
fclose(arquivo);
}
 
void calcular(int a, int b, int c){
FILE *arquivo;
arquivo=abre('a', "fn.txt");
fprintf(arquivo, "%d", c);
fechar(arquivo);
}
void listar(){
FILE *arquivo;
int c;
arquivo=abre('l',"fn.txt");
 
while(!feof(arquivo)){
fscanf(arquivo, "%d",&c);
printf("O resultado e: %d\n");
}
fechar(arquivo);
}
int main()
{
int opcao, a, b, c;
do{
printf("\nseja bem vindo\n");
printf("1-calcular");
printf("\n2-listar");
printf("\n3-sair");
printf("\nDigite uma opcao:  ");
scanf("%d", &opcao);
 
switch (opcao){
case 1:
printf("digite o primeiro numero:  \n");
scanf("%d",&a);
 
printf("digite o segundo numero:  \n");
scanf("%d",& B);
c=a+b;
printf("O total e: %d\n", c);
 
system("pause");
break;
 
case 2:
listar();
system("pause");
break;
 
case 3:
printf("Finalizando...\n");
system ("pause");
exit(0);
 
default:
printf("opcao invalida! tente novamente...\n");
system ("pause");
 
}
 
while(opcao!=3){
return 0;
}
}
}
 

 

Link para o comentário
Compartilhar em outros sites

É o erro ao copilar: vou mandar o código já melhorado, porém ainda tem erros.

#include <stdio.h>
#include <stdlib.h>
 
FILE *abre( char modo, char caminho[30]){
FILE *arquivo;
switch(modo){
case 'g':
arquivo=fopen(caminho, "wt");
break;
case 'l':
arquivo=fopen(caminho, "rt");
break;
case 'a':
arquivo = fopen(caminho, "a");
}
if(arquivo==NULL){      //Se houver algum erro, o ponteiro apontará para NULL
        printf("Nao foi possivel abrir o arquivo\n");
        exit(0);
    }            
    return arquivo;
}
 
void fechar(FILE *arquivo){
fclose(arquivo);
}
 
void calcular(int a, int b, int c){
FILE *arquivo;
arquivo=abre('a', "fn.txt");
fprintf(arquivo, "%d", c);
fechar(arquivo);
}
void listar(){
FILE *arquivo;
int c;
arquivo=abre('l',"fn.txt");
 
while(!feof(arquivo)){
fscanf(arquivo,"%d", &c);
printf("O resultado e: %d\n", c);
}
fechar(arquivo);
}
int main()
{
int opcao, a, b, c;
do{
printf("\nseja bem vindo\n");
printf("1-calcular");
printf("\n2-listar");
printf("\n3-sair");
printf("\nDigite uma opcao:  ");
scanf("%d", &opcao);
 
switch (opcao){
case 1:
FILE *arquivo;
arquivo=abre('a', "fn.txt");
fprintf(arquivo, "%d", c);
printf("Digite o primeiro numero: ");
scanf("%d",&a);
printf("Digite o segundo numero: ");
scanf("%d",&B);
c=a+b;
printf("O resultado e: %d", c);
 
system("pause");
break;
 
case 2:
listar();
system("pause");
break;
 
case 3:
printf("Finalizando...\n");
system ("pause");
exit(0);
 
default:
printf("opcao invalida! tente novamente...\n");
system ("pause");
 
}
}
 
while(opcao!=3);{
return 0;
}
}
 
Quando escolho a opcao listar da erro.
Link para o comentário
Compartilhar em outros sites

Peça ajuda ao seu professor para te explicar as regras de scope and blocks;

 

o erro se encontrava no scope da estasiamento main::do::switch()::case 1

 

** Você tentou usar uma variável não declarada no scanf::&B 

***deveria ser scanf::&b; &B não existe.

 

**Você tentou criar uma variável da ponteiro da estrutura file dentro de um label; FILE * arquivo;

***deveria criar externamente no topo da função, junta com as demais;

 

Faça as modificações para corrigir o estado atual, e nos posto os resultado e se positivo.

Link para o comentário
Compartilhar em outros sites

Obrigado, vou tentar.


kkkkkk também  não tenho professor, estudo só. Por isso esses erros de principiantes... mas tá valendo, errando que se aprende...


Senhores, meu programa está gravando o resultado no arquivo "fn.txt" com exito. Meu problema agora é a função listar, pois exibe " O resultado e: 19456940000" e entra em um loop infinito.

E também, mostra um erro( [Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]) na linha 27 *****void calcular(int a, int b, int c)****  e os mesmos erros na linha 29, respectvamente : ******arquivo=abre('a', "fn.txt");***** 


Estou mandando o código como está agora: 

#include <stdio.h>
#include <stdlib.h>
 
FILE *abre( char modo, char caminho[1000]){
FILE *arquivo;
switch(modo){
case 'g':
arquivo=fopen(caminho, "wt");
break;
case 'l':
arquivo=fopen(caminho, "rt");
break;
case 'a':
arquivo = fopen(caminho, "a");
 
}
if(arquivo==NULL){      //Se houver algum erro, o ponteiro apontará para NULL
        printf("Nao foi possivel abrir o arquivo\n");
        exit(0);
    }            
    return arquivo;
}
 
void fechar(FILE *arquivo){
fclose(arquivo);
}
 
void calcular(int a, int b, int c){
FILE *arquivo;
arquivo=abre('a', "fn.txt");
fprintf(arquivo, "O total e: %d\n", c);
fechar(arquivo);
}
void listar(){
FILE *arquivo;
int c;
arquivo=abre('l', "fn.txt");
 
while(!feof(arquivo)){
fscanf(arquivo,"%d", &c);
printf("\nO resultado e: %d");
 
}
fechar(arquivo);
}
int main()
{
int a, b, c;
int opcao;
do{
printf("\nseja bem vindo\n");
printf("1-calcular");
printf("\n2-listar");
printf("\n3-sair");
printf("\nDigite uma opcao:  ");
scanf("%d", &opcao);
 
switch (opcao){
case 1:
 
FILE*arquivo;
arquivo=abre('a', "fn.txt");
 
printf("Digite o primeiro numero: ");
scanf("%d",&a);
printf("Digite o segundo numero: ");
scanf("%d",&B);
c=a+b;
calcular(a, b, c);
 
 
 
printf("O resultado e: %d", c);
 
fechar(arquivo);
system("pause");
break;
 
case 2:
listar();
system("pause");
 
break;
 
case 3:
printf("Finalizando...\n");
system ("pause");
exit(0);
 
default:
printf("opcao invalida! tente novamente...\n");
system ("pause");
 
}
}
 
while(opcao!=3);{
return 0;
}
}
 
 
Link para o comentário
Compartilhar em outros sites

Fiz um teste apenas com a função lista;

Com os seguintes passos:

  1. Criei um arquivo com nome fn.txt, no mesmo local onde se encontra o programa em meu PC.
  2. Copilei o código, com as modificações já propostas aqui no fórum.
  3. Optei por listar.
  4. o resultado, foi os números que gravei previamente no arquivo fn.txt (usei o bloco de notas para gravar);

programacao_C_Mauro_Britivaldo_Teste.png

 

Essa função esta ótima.

Link para o comentário
Compartilhar em outros sites

Senhor Mauro, estou muito agradecido pela atenção, mas ainda estou com duvidas. Sobre a variável "B" já consertei para o b minusculo, mas eu ainda não entendi o que o senhor quis dizer com: **Você tentou criar uma variável da ponteiro da estrutura file dentro de um label; FILE * arquivo;

***deveria criar externamente no topo da função, junta com as demais;

Gostaria de um exemplo....
Ainda meu programa não esta lendo os resultados da soma que estão sendo gravados no arquivo "fn.txt".... Estou a dias tentando..

:confused: 
 

Link para o comentário
Compartilhar em outros sites

 **Você tentou criar uma variável da ponteiro da estrutura file dentro de um label; FILE * arquivo;
***deveria criar externamente no topo da função, junta com as demais;
 
Uma exemplo deste erro:
int opcao = 0;            switch(opcao)         {            case 0: // <- isso se chama Label.               int i; //É uma erro declarar variáveis dentro do Label,                       //por tanto não copila, pois inflige as regras.               i = 10;               printf("Valor de i: %d", i);            break;         ...         }}

Para copilar tem que ser fora do label

int opcao = 0;int i = 0; //Fora do Label funciona, agora não infligiu nenhum regra.            switch(opcao)         {            case 0: // <- isso se chama Label.               i = 10; // pode acessar, porém não declarar.               printf("Valor de i: %d", i);            break;         ...         }}

agora a função que grava

void calcular(int a, int b, int c){FILE *arquivo;arquivo=abre('a', "fn.txt");fprintf(arquivo, "O total e: %d\n", c);fechar(arquivo);}

Ela não condiz com a função que ler:

void listar(){FILE *arquivo;int c;arquivo=abre('l', "fn.txt");while(!feof(arquivo)){fscanf(arquivo,"%d", &c);printf("\nO resultado e: %d");}

Em uma você gravou string depois numero;

Na outro você quer ler somente o numero, isso não pode acontecer assim!

Gravação e leitura tem que ser condizentes!

fprintf(arquivo, "%d ", c); <- assim fica condizente com -> fscanf(arquivo,"%d", &c)

O total e: %d não é igual a %d, por isso vai dar erro

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Meu amigo... identifiquei e executei como o senhor propôs, porém mesmo assim meu programa grava no arquivo e infelizmente quando opto pela função listar ele continua no loop infinito e exibindo o numero da memoria da variável, (não os que estão gravados no "fn.txt")...
O senhor tentou copila-lo da forma que está?
 

*Obrigado por me ensinar o que é um label e me instruir para não declarar as variáveis dentro dele.

Link para o comentário
Compartilhar em outros sites

Mauro não te conheço, mas meu brother,... muito obrigado!!! O senhor me ajudou muito. Estou postando o código que ainda tem um errinho(está imprimindo 2 vezes o ultimo resultado) , mas está bom: 

 

#include <stdio.h>
#include <stdlib.h>
 
FILE *abre( char modo, char caminho[100]){
FILE *arquivo;
switch(modo){
case 'g':
arquivo=fopen(caminho, "wt");
break;
case 'l':
arquivo=fopen(caminho, "rt");
break;
case 'a':
arquivo = fopen(caminho, "a");
break;
}
if(arquivo==NULL){      //Se houver algum erro, o ponteiro apontará para NULL
        printf("Nao foi possivel abrir o arquivo\n");
        exit(0);
    }            
    return arquivo;
}
 
void fechar(FILE *arquivo){
fclose(arquivo);
}
 
int a, b, c, d;
void calcular(){
FILE *arquivo;
arquivo=abre('a', "resultados.txt");
printf("Digite o primeiro numero: ");
scanf("%d",&a);
printf("Digite o segundo numero: ");
scanf("%d",&b  );
c=a+b;
fprintf(arquivo, "%d\n",c);
 
system ("cls");
 
printf("O resultado e: %d\n", c);
fechar(arquivo);
}
void listar(){
FILE *arquivo;
arquivo=abre('l', "resultados.txt");
 
 
while(!feof(arquivo)){
fscanf(arquivo,"%d", &c);
printf("O total e: %d\n",c);
}
 
fechar(arquivo);
}
int main()
{
int opcao;
do{
printf("\nseja bem vindo\n");
printf("1-calcular");
printf("\n2-listar");
printf("\n3-sair");
printf("\nDigite uma opcao:  ");
scanf("%d", &opcao);
system("cls");
switch (opcao){
 
case 1:
FILE* arquivo;
calcular();
fechar(arquivo);
system("pause");
break;
 
case 2:
listar();
system("pause");
break;
 
case 3:
printf("Finalizando...\n");
system ("pause");
exit(0);
 
default:
printf("opcao invalida! tente novamente...\n");
system ("pause");
 
}
}
 
while(opcao!=3);{
return 0;
}
}
Link para o comentário
Compartilhar em outros sites

A função que grava dados no arquivo termina de gravar com  uma nova linha;

fprintf(arquivo, "%d\n",c);

esse nova linha e lida pelo feof(), mais não e lido por scanf()

dais a repetição;

 

Como resolver isso:

if(fscanf(arquivo,"%d", &c) == 1)printf("O total e: %d\n",c);

Ou seja somente haverá impressão se houver dados, se não, não! 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

void listar(){
FILE *arquivo;
arquivo=abre('l', "resultados.txt");
 
 
while(!feof(arquivo)){
if( fscanf(arquivo,"%s %d", &nome, &c)==1){
printf("%s %d\n", nome, c);
}
 
}
 
fechar(arquivo);
}
 
Mauro, acho que fiz conforme o senhor disse, mas quando opto pela função listar no menu, Não acontece nada.
" Pressione qualquer tecla para continuar....."
Link para o comentário
Compartilhar em outros sites

  • Solução

#include <stdio.h>#include <stdlib.h>FILE *abre( char modo, char caminho[100]){	FILE *arquivo;	switch(modo){		case 'g':			arquivo=fopen(caminho, "wt");			break;			case 'l':				arquivo=fopen(caminho, "rt");				break;				case 'a':					arquivo = fopen(caminho, "a");					break;	}	if(arquivo==NULL){      //Se houver algum erro, o ponteiro apontará para NULL        printf("Nao foi possivel abrir o arquivo\n");        exit(0);    }                return arquivo;}void fechar(FILE *arquivo){	fclose(arquivo);}char nome[30];int a, b, c, d;void calcular(){		FILE *arquivo;		arquivo=abre('a', "resultados.txt");		printf("Digite o primeiro numero: ");		scanf("%d",&a);		printf("Digite o segundo numero: ");		scanf("%d",&;		c=a+b;		fprintf(arquivo, "O_resultado_e: %s %d\n", nome, c);				system ("cls");				printf("O resultado e: %d\n", c);		fechar(arquivo);}void listar(){	FILE *arquivo;			arquivo=abre('l', "resultados.txt");			while(!feof(arquivo)){	 if(	fscanf(arquivo,"%s %d", &nome, &c)==2){	 	printf("%s %d\n", nome, c);		 }			}			fechar(arquivo);}int main(){	int opcao;	do{		system("cls");		printf("\t\t*** Seja bem vindo ***\t\t");		printf("\n1-calcular");		printf("\n2-listar");		printf("\n3-sair");		printf("\nDigite uma opcao:  ");		scanf("%d", &opcao);		system("cls");		switch (opcao){						case 1:			FILE* arquivo;				calcular();				fechar(arquivo);				system("pause");				break;							 				case 2:						listar();						system("pause");						break;										case 3:						printf("Finalizando...\n");						system ("pause");						exit(0);												default:							printf("opcao invalida! tente novamente...\n");							system ("pause");								}	}				while(opcao!=3);{			return 0;		}	} 

Senhor mauro, resolvi o problema. Muito obrigado mesmo! Sem sua ajuda não teria conseguido, aprendi muito com o senhor. 

Espero um dia ser tão bom em c++ quanto o senhor kkkk. Obrigado!  Vou postar o código da forma que ficou e dar como tópico resolvido.

Novamente, obrigado.  :hehehe:  :hehehe:

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...