Ir ao conteúdo
  • Cadastre-se

C Problemas alterando uma variável de uma struct de um arquivo .txt


FgD

Posts recomendados

Olá, estou tendo dificuldades em um código para um trabalho de faculdade. O código que eu fiz é para rodar linha por linha de um arquivo .txt onde estão armazenados carros e alterar todas as taxas de locação dos carros que tiverem a mesma marca. O programa roda sem problema algum quando há apenas um carro com a mesma marca, agora quando há mais de um carro cadastrado com a mesma marca, só o primeiro é alterado. Alguma ideia do porquê isto está acontecendo?

(Caso seja preciso a função de cadastrar o carro ou/e o arquivo .txt, posso postá-los a seguir)

 

void alterarTaxas(){
	FILE* carros;
    CARROS car;
    char modelo[15];
    long pos;
    int taxa;
	
    carros = fopen("carros.txt", "r+");
    if(carros == NULL){
        printf("PROBLEMAS NA ABERTURA DO ARQUIVO 'CARROS'. POR FAVOR CONTATAR O RESPONSÁVEL PELO PROGRAMA!\n\n");
        system("pause");
        exit(0);
    }else{
        printf("Digite o modelo do carro para alterar sua taxa: ");
        scanf(" %s", &modelo);
        while(fread(&car, sizeof(CARROS), 1, carros) == 1){
            if(strcmp(modelo, car.modelo) == 0){
            	taxa = car.taxa;
            }
        }
        printf("A taxa é %d, Digite o valor da nova taxa: ", taxa);
        scanf(" %d", &taxa);
        fseek(carros, 0, SEEK_SET);
        pos = ftell(carros);
        while(fread(&car, sizeof(CARROS), 1, carros) == 1){
            if(strcmp(modelo, car.modelo) == 0){
                car.taxa = taxa;
                fseek(carros, pos, SEEK_SET);
                fwrite(&car, sizeof(CARROS), 1, carros);            
            }
            pos = ftell(carros);
        }
        fclose(carros);
        getch();
    }
}

 

Link para o comentário
Compartilhar em outros sites

Seria melhor postar como é salvado no arquivo. Mas pelo que entendi:

 


1-        fseek(carros, 0, SEEK_SET);
2-        pos = ftell(carros);
3-        while(fread(&car, sizeof(CARROS), 1, carros) == 1){
4-            if(strcmp(modelo, car.modelo) == 0){
5-                car.taxa = taxa;
6-                fseek(carros, pos, SEEK_SET);
7-                fwrite(&car, sizeof(CARROS), 1, carros);            
8-            }
9-            pos = ftell(carros);
10-        }

Depois da linha 7 tente usar continue, ou pule 2 linhas.

Link para o comentário
Compartilhar em outros sites

Em 17/11/2017 às 19:58, TYSQUARE89 disse:

Seria melhor postar como é salvado no arquivo. Mas pelo que entendi:

 



1-        fseek(carros, 0, SEEK_SET);
2-        pos = ftell(carros);
3-        while(fread(&car, sizeof(CARROS), 1, carros) == 1){
4-            if(strcmp(modelo, car.modelo) == 0){
5-                car.taxa = taxa;
6-                fseek(carros, pos, SEEK_SET);
7-                fwrite(&car, sizeof(CARROS), 1, carros);            
8-            }
9-            pos = ftell(carros);
10-        }

Depois da linha 7 tente usar continue, ou pule 2 linhas.

 

Desculpa a demora haha, eu tentei adicionar mas não funcionou. Continua alterando apenas o primeiro carro cadastrado com o nome que eu procuro. A função do meu código de adicionar carros no txt é essa:

void inputCarro(){
	FILE* carros;
	CARROS car;
    int opCarro;
	
	carros = fopen("carros.txt", "a");
	if(carros == NULL){
		printf("PROBLEMAS NA ABERTURA DO ARQUIVO 'CARROS'. POR FAVOR CONTATAR O RESPONSÁVEL PELO PROGRAMA!\n\n");
		system("pause");
		exit(0);
	}else{
		printf("Modelo: ");
		scanf(" %[^\n]s", &car.modelo);

		printf("Placa: ");
		scanf(" %[^\n]s", &car.placa);
		
		printf("Ano: ");
		scanf("%d", &car.ano);
		
		printf("Cor: ");
		scanf(" %[^\n]s", &car.cor);
						
		car.alugado = 'N';
		car.status = 'S';
		car.taxa = 10;
		printf("As informações acimas estão corretas?\n");
		printf("\nDigite '1' para progesseguir\n");
		printf("Digite '2' para cancelar\n");
		scanf(" %d", &opCarro);
		if (opCarro == 1){
			fwrite(&car, sizeof(CARROS), 1, carros);
			fclose(carros);
			system("cls");
			printf("Carro adicionado com sucesso!");
			getch();
		}
	}
}

E a struct "carros" é essa:

typedef struct carros CARROS;
struct carros{
	char modelo[15];
	char placa[8];
	int ano;
	char cor[20];
	char alugado;
	char status;
	double taxa;
};

 

Link para o comentário
Compartilhar em outros sites

@FgD Se você quer alterar a taxa de todos modelos iguais para apenas uma taxa, você só precisa buscar o modelo e alterar a taxa:

void alterarTaxas(){
	FILE* carros;
    CARROS car;
    char modelo[15];
    long pos;
    int taxa;
	
    carros = fopen("carros.txt", "r+");
    if(carros == NULL){
        printf("PROBLEMAS NA ABERTURA DO ARQUIVO 'CARROS'. POR FAVOR CONTATAR O RESPONSÁVEL PELO PROGRAMA!\n\n");
        system("pause");
        exit(0);
    }else{
        char cnf = '\0';
        printf("Digite o modelo do carro para alterar sua taxa: ");
        scanf(" %s", &modelo);
        printf("Digite o valor da nova taxa: ");
        scanf(" %d", &taxa);
        while(fread(&car, sizeof(CARROS), 1, carros) == 1){
            if(strcmp(modelo, car.modelo) == 0){
                printf("A taxa é %d da cor %s\nDeseja mudar para %d?(s/n)", car.taxa, car.cor,taxa);
		scanf(" %c",&cnf);
            	car.taxa = ((cnf == 's') ? taxa:car.taxa);
                fwrite(&car, sizeof(CARROS), 1, carros);
            }
        }
    }
    fclose(carros);
}

 

Link para o comentário
Compartilhar em outros sites

Em 19/11/2017 às 20:54, TYSQUARE89 disse:

@FgD Se você quer alterar a taxa de todos modelos iguais para apenas uma taxa, você só precisa buscar o modelo e alterar a taxa:


void alterarTaxas(){
	FILE* carros;
    CARROS car;
    char modelo[15];
    long pos;
    int taxa;
	
    carros = fopen("carros.txt", "r+");
    if(carros == NULL){
        printf("PROBLEMAS NA ABERTURA DO ARQUIVO 'CARROS'. POR FAVOR CONTATAR O RESPONSÁVEL PELO PROGRAMA!\n\n");
        system("pause");
        exit(0);
    }else{
        char cnf = '\0';
        printf("Digite o modelo do carro para alterar sua taxa: ");
        scanf(" %s", &modelo);
        printf("Digite o valor da nova taxa: ");
        scanf(" %d", &taxa);
        while(fread(&car, sizeof(CARROS), 1, carros) == 1){
            if(strcmp(modelo, car.modelo) == 0){
                printf("A taxa é %d da cor %s\nDeseja mudar para %d?(s/n)", car.taxa, car.cor,taxa);
		scanf(" %c",&cnf);
            	car.taxa = ((cnf == 's') ? taxa:car.taxa);
                fwrite(&car, sizeof(CARROS), 1, carros);
            }
        }
    }
    fclose(carros);
}

Eu tentei dessa forma também e infelizmente não funcionou. :(

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!