Ir para conteúdo
atkinson

Modificar linha em FILE txt (C)

Recommended Posts

Oi, estou fazendo um sistema de locadora de carros pra um projeto de faculdade em C, mas estou tendo problemas em uma parte. Meu código ele registra carros e os localiza quando disponíveis, e no arquivo carros.txt os dados ficam organizados dessa maneira:

 

1 XXX1234 Gol 120

0 YYY1234 Corsa 110

 

O 1 e 0 no começo pra determinar disponível ou indisponível

O XXX1234 é a placa do carro

Logo depois da placa vem o modelo do carro

E no final é o valor da diaria de cada carro, sendo o gol 120 reais por dia e o corsa 110 reais por dia.

 

Eu gostaria de saber, entre todos os carros, como eu poderia por exemplo, digamos que alugaram o gol, como eu faço pro meu sistema localizar o Gol, e modificar o 1 pra 0. Não estou conseguindo achar os comandos q fazem essa busca e alteração. Se alguem puder me ajudar, agradeço muitíssimo. Obrigado pelo seu tempo!

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
3 minutos atrás, _Isis_ disse:

você precisa ser do arquivo,alterar em memória e gravar antes de sair do programa.

http://en.cppreference.com/w/c

Sim, eu estou tentando com o fseek, mas o fseek ele exige q você mova ele por colunas e letras, mas eu queria que ele setasse a partir do momento que ele encontrasse a informação, porque eu não vou saber com exatidão onde estará o carro na lista.

Tem como eu localizar a placa? Por exemplo, a pessoa digita a placa do carro que quer alugar, e eu use o fseek pra procurar em específico a placa, e volte uma informação pra alterar o 1 pra 0?

Compartilhar este post


Link para o post
Compartilhar em outros sites

você não entendeu. Leia o arquivo inteiro em memória no início do programa. Todas as operações de aluguel são feitas em memória primeiro e só depois você escreve em arquivo *tudo* o que está em memória sobrescrevendo o conteúdo do arquivo.

Também dá pra mapear o arquivo em memória, mas é mais complicado: 
https://en.wikipedia.org/wiki/Memory-mapped_file
https://stackoverflow.com/questions/8411709/memory-mapped-files
https://www.gnu.org/software/libc/manual/html_node/Memory_002dmapped-I_002fO.html

Se você estiver usando um ambiente específico, tipo POSIX, dá pra tentar criar toda a lista de carros em memória + a informação das linhas no arquivo lendo linha por linha e processando os dados usando expressão regular.

Compartilhar este post


Link para o post
Compartilhar em outros sites
/*Antes de executar o programa abaixo pela primeira vez crie um arquivo de texto vazio chamado "carros" na mesma pasta do executavel.*/

#include<stdio.h>

int main(){
  FILE *arquivo;  
  int resposta=0,diaria,totaldecarros,contacarros,i;
  char nomedocarro[20],placa[8],caractere,textotemporario[1000];  
  while(resposta!=3){
    printf("O que deseja fazer ?");
    printf("\n1.Cadastrar carro");
    printf("\n2.Alugar carro");
    printf("\n3.Sair");
    scanf("%d",&resposta);
    if(resposta==1){
      printf("Digite o nome do carro:");
      scanf("%s",nomedocarro);
      printf("Digite a placa:");
      scanf("%s",placa);
      printf("Digite o valor da diaria:");
      scanf("%d",&diaria);
      arquivo=fopen("carros.txt","a");
      fprintf(arquivo,"%d ",1);
      fprintf(arquivo,"%s ",placa);
      fprintf(arquivo,"%s ",nomedocarro);
      fprintf(arquivo,"%d\n",diaria);
      fclose(arquivo);
    }
    else if(resposta==2){
      arquivo=fopen("carros.txt","r");
      totaldecarros=0;
      i=0;
      while(1){
        caractere=
fgetc(arquivo);
        if(caractere=='\n'){          
          printf("    %d",totaldecarros+1);
          totaldecarros++;
        }
        if(caractere!=EOF){

          printf("%c",caractere);
          textotemporario[i]=caractere;
          i++;
        }
        else{
          textotemporario[i]='\0';
          break;
        }
      }
    
 
 if(!totaldecarros)
        printf("Nao ha carros cadastrados.");
    
 
 else{
        printf("Digite o numero a direita do valor da diaria do carro que quer alugar:");
        scanf("%d",&resposta);
        if((resposta<1)||(resposta>totaldecarros)){
          printf("Numero invalido.");
          fclose(arquivo);
        }
        else{
          fclose(arquivo);
          arquivo=fopen("carros.txt","w");
          i=0;
          contacarros=1;
          while(contacarros!=resposta){
            if(textotemporario[i]=='\n')
              contacarros++;
            i++;
          }
          textotemporario[i]='0';
          fprintf(arquivo,"%s",textotemporario);
          fclose(arquivo);
        }
        if(resposta==3)
          resposta=0;
      } 

    }    
  }
  system("pause");
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.

  • Conteúdo Similar

    • Por biza
      Ola
      Estou  a construir um datalogger em código C.Desta forma necessito passar os dados entre ficheiros. O meu problema está na inclusão de algumas variáveis no topo de um arquivo .txt onde os dados são salvos. Variáveis como tempo de data e hora, id do dispositivo e muito mais... Para isso preciso de ajuda, gostaria que os dados estivessem disponíveis para todos os arquivos, até aí é fácil, basta incluir a variável como extern, no arquivos *.h e incluí-lo em todos os outros que você deseja que a variável esteja disponível. mas como posso fazer para ter acesso a ele dentro do array que preciso?
      Exemplo: main.c
      #include "main.h" char dateTimeFormat[24]; void main(void){ dateTimeFormat = "22-02-22 13:23:04"; } main.h
      extern char dateTimeFormat[24];  
      teste.c
       
      #include "main.h" extern char dateTimeFormat[24]; /*Header .txt file initialization*/ volatile char headerFile[] ="\n\n" "# HEALT MONITORING SYSTEM \r\n" "# DEVELOPED: BIZA \r\n" "# VERSION: B \r\n" "# DATATIMECAPTURE:"+dateTimeFormat+ "\r\n" "# SAMPLINGFREQUENCY: 500 \r\n" "# SAMPLECHANNELS: 1 2 3 4 5 6 7 8 \r\n" "# SAMPLINGRESULUTION: 24 \r\n" "# IDDEVICE: HEALTHY \r\n" "# ENDOFHEADER  
      Como posso incluir a variável "dateTimeFormat" dentro do headerFile como descrevi acima?
       
    • Por AlexandreHenrique
      Olá pessoal. preciso de uma ajuda com o meu projeto de upload.
      O projeto de upload roda no IIS + Php;
      Tenho um script que ta enviando  o arquivo para o diretório correto.
      O problema é que ao tentar acessar esse arquivo via URL, o anexo não abre  e exibe a mensagem abaixo.
       

      Notei que o arquivo ao cair no DIR, ele entra sem permissões (vi em propriedades), se eu editar o mesmo alterando as permissões, ele carrega pela url do meu site.
      Quero que o arquivo enviado pelo script caia no DIR correta com as devidas permissões pra eu poder ler no navegador via URL;
       
      Já tentei resolver de toda forma mas nao tive sucesso;.
      No Apache isso é mais simples, mas no IIS ta complicado;
       
       
       
      Alguem pode me dá uma dica?
    • Por oromotoceu
      #include <stdio.h>
      #include <stdlib.h>
      #define MAXTAM 1000
      int Frente, Tras, Lista[MAXTAM];
      void Lista_Construtor(){
      Frente=0;
      Tras=-1;
      }
      int Lista_Vazia(){
      if(Tras==-1)
      return 1;
      else
      return 0;
      }
      int Lista_Cheia(){
      if(Tras==MAXTAM-1)
      return 1;
      else
      return 0;
      }
      int Lista_Tamanho(){
      return Tras+1;
      }
      int Lista_Inserir_Inicio(int Valor){
      if(Lista_Cheia()){
      return 0;
      }else{
      /*se quero inserir na posição 0,
      vou deslocar todos os elementos para frente*/
      for(int i=Tras+1;i>Frente;i--){
      Lista=Lista[i-1];
      }
      Lista[Frente]=Valor;
      Tras++;
      return 1;
        }
      }
      int Lista_Inserir_Fim(int Valor){
      if(Lista_Cheia()){
      return 0;
      }else{
      Tras++;
      Lista[Tras]=Valor;
      return 1;
        }
      }
      int Lista_Inserir(int Valor, int Posicao){
      if(Lista_Cheia()){
      return 0;
      }else{
      /* Para verificar se a posição
      está no meio da lista */
      if(Posicao>Frente && Posicao<Tras){
      for(int i=Tras+1;i>Posicao;i--){
      Lista=Lista[i-1];
      }
      Lista[Posicao]=Valor;
      Tras++;
      return 1;
      }else{ 
      return 0;
         }
        }
      }
      int Lista_Remover_Inicio(int *Valor){
      if(Lista_Vazia()){
      return 0;
      }else{
      *Valor =Lista[Frente];
      for(int i=Frente;i<Tras;i++){
      Lista=Lista[i+1];
         }
      Tras--;
        }
      }
      int Lista_Remover_Fim(int *Valor){
      if(Lista_Vazia()){
      return 0;
      }else{
      *Valor=Lista[Tras];
      Tras--;
      return 1;
        }
      }
      int Lista_Remover(int *Valor, int Posicao){
      if(Lista_Vazia()){
      return 0;
      }else{
      if(Posicao>Frente && Posicao<Tras){
      *Valor=Lista[Posicao];
      for(int i=Posicao;i<Tras;i++){
      Lista=Lista[i+1];
      }
      Tras--;
      return 1;
         }
        }
      }
      int Lista_Get_toda(int *Valor){
      if(Lista_Vazia()){
      return 0;
      }else{
      *Valor=Lista[Frente];
      return 1;
        }
      }
      int Lista_Get_inicio(int *Valor){
      if(Lista_Vazia()){
      return 0;
      }else{
      *Valor=Lista[Frente];
      return 1;
        }
      }
      int Lista_Get_Fim(int *Valor){
      if(Lista_Vazia()){
      return 0;
      }else{
      *Valor=Lista[Tras];
      return 1;
        }
      }
      int Lista_Busca_Valor(int Valor, int *Posicao){
      int i;
      if(Lista_Vazia()){
      return 0;
      }else{
      for(i=Frente;i<Tras;i++){
      if(Lista==Valor){
      break;
        }
      }
      if(i==Tras){
      return 0;
      }else{
      *Posicao=i; 
      return 1;
         }
        }
      }
      int Lista_Busca_Posicao(int *Valor, int Posicao){
      if(Lista_Vazia()){
      return 0;
      }else{
      if(Posicao>Frente && Posicao<Tras){
      *Valor=Lista[Posicao];
      return 1;
      }else{
      return 0;
         }
        }
      }
      int main(){
      int i,Valor,op=0,pos;
      Lista_Construtor();
      while(op!=12){
      printf("*** Menu de opções ***\n");
      printf("1-Inserir início\n");
      printf("2-Inserir fim\n");
      printf("3-Inserir meio\n");
      printf("4-Excluir início\n");
      printf("5-Excluir fim\n");
      printf("6-Excluir meio\n");
      printf("7-Mostrar toda lista\n");
      printf("8-Mostrar primeiro item da lista\n");
      printf("9-Mostrar último item da lista\n");
      printf("10-Mostrar a posição de um item da lista\n");
      printf("11-Mostrar o valor de uma posição\n");
      printf("12-Sair\n");
      printf("Escolha uma opção: ");
      scanf("%d", &op);
      switch(op){
          case 1:
              printf("Digite o valor a ser inserido: ");
              scanf("%d", &Valor);
              Lista_Inserir_Inicio(Valor);
              break;
          case 2:
              printf("Digite o valor a ser inserido: ");
              scanf("%d", &Valor);
              Lista_Inserir_fim(Valor);
              break;
            case 3:
              printf("Digite o valor a ser inserido: ");
              scanf("%d", &Valor);
              printf("Digite a posição que deseja inserir: ");
              scanf("%d", &pos);
              Lista_ Inserir_meio(int Valor, pos); 
              break;
            case 4:
              printf("Digite a remoção do início: ");
              scanf("%d", &*Valor);
              Lista_ Excluir_inicio(*Valor); 
              break;
              case 5:
              printf("Digite a remoção do fim: ");
              scanf("%d", &*Valor);
              Lista_ Excluir_fim(*Valor); 
              break;
              case 6:
              printf("Digite a remoção do meio: ");
              scanf("%d", &Valor);
              printf("Digite a posição que deseja remover: ");
              scanf("%d", &*Posicao);
              Lista_ Excluir_meio(intValor, * pos); 
              break;
               case 7:
              printf("Digite ao a mostrar toda lista: ");
              scanf("%d", &Valor);
              Lista_ mostrar_toda_lista(Valor);
              break;
             case 8:
              printf("Digite ao a mostrar primeiro item da lista: ");
              scanf("%d", &*Valor);
              Lista_ mostrar_primeiro_item_da_lista(*Valor);
              break;
             case 9:
              printf("Digite ao a mostrar último item da lista: ");
              scanf("%d", &*Valor);
              Lista_ mostrar_ultimo_item_da_lista(*Valor);
              break;
              case 10:
              printf("Digite ao a mostrar a posição de um item da lista: ");
              scanf("%d", &Valor);
              printf("Digite a posição que deseja mostrar na lista: ");
              scanf("%d", &* pos);
              Lista_ mostrar_posicao_de_um_item_da_lista(intValor, *pos);
              break;
              case 11:
              printf("Digite ao a mostrar o valor de uma posição: ");
              scanf("%d", &*Valor
              printf("Digite a posição que deseja mostrar no valor: ");
              scanf("%d", &pos);
              Lista_ mostrar_posicao_de_um_valor_da_lista(int*Valor, pos);
              break;
              case 12:
              default:
              printf("Valor Invalido!\n");
              system("PAUSE");
               }
         }
       return 0;
      }
    • Por oromotoceu
      bom dia pode me ajudar nessa questão por favor
      O programa deverá trabalhar dados de um veículo, onde será armazenado, Nome do proprietário, placa do carro, modelo do carro e preço do carro.
      O programa deve ter as seguintes opções:
      Inserir dados (todos os dados sugeridos no enunciado acima).
      Excluir um Carro específico com a busca pela placa.
      Editar dados de um Carro com a busca pela placa.
      Consultar carro por Placa.
      Exibir todos os dados cadastrados.
      Finalizar programa.
      A opção exibir todos os dados, apresenta tudo que já foi cadastrado e está na memória.
       
    • Por TK_T
      olá sou iniciante consegui fazer um o código de um exercício só que quando eu peço o valor 12ab ele lê como numérica alguém pode me ajudar? 
      Exercício: Leia uma string e diga se a mesma é numérica (na base decimal) ou não.
      Ex.: "123" -> numérica
      "abc" -> não numérica
      "12ab" -> não numérica
      "12.34" -> numérica 
      #include <stdio.h> int main() { char Numero; printf("Digite Algo: "); scanf("%c", &Numero); if(Numero == '1' || Numero == '2' || Numero == '3' || Numero == '4' || Numero == '5' || Numero == '6' || Numero == '7' || Numero == '8' || Numero== '9' || Numero == '0') printf("\tNumérica...\n"); else printf("\tNão Numérica\n"); return 0; }  
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.