Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

[Dúvida] Manipulação de arquivo

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    C / C++ [Dúvida] Manipulação de arquivo

    Hey.
    Bom, pesquisei bastante antes de resolver vir aqui pedir ajuda, não achei uma solução para isso em lugar nenhum.

    Código:
    #include "stdafx.h"
    #include <cstdio>
    #include <Windows.h>
    
    #pragma warning(disable : 4996) // para remover a mensagem fopen function may be unsafe
    
    int _tmain(int argc, _TCHAR* argv[]) // função principal
    {
    	char buff[100], asd[30];
    	FILE * fp;
    
    	if ((fp = fopen("teste.ini", "r+")) == NULL) // abrir o arquivo "teste.ini" para leitura/escrita
    	{
    		MessageBoxA(0, "teste.ini não foi carregado!", "Erro!", 0x30); // msg de erro se não for possível abrir o arquivo
    		exit(1);
    
    	}
    	else
    	{
    		while (fscanf(fp, "%s", buff) != EOF) // Enquanto não retornar -1 continuar lendo
    		{
    			if (strcmp(buff, "Nome=") == 0) 
    			{
    				printf("Digite o seu nome: ");
    				gets(asd);
    				fputs(asd, fp);		
    				fflush(fp);
    			}
    			
    			if (strcmp(buff, "Idade=") == 0)
    			{
    				printf("Digite a sua Idade: ");
    				gets(asd);
    				fputs(asd, fp);
    				fflush(fp);
    			}
    		}	
    			fclose(fp); // fecha arquivo quando for totalmente lido
    	}
    	return 0;
    }
    O problema é que se eu rodar esse programa o output será:
    Digite seu nome:
    e quando eu digitar o executável fechará e não escreverá no .ini,
    porém se eu remover essa parte do código:

    Código:
                           if (strcmp(buff, "Idade=") == 0)
    			{
    				printf("Digite a sua Idade: ");
    				gets(asd);
    				fputs(asd, fp);
    				fflush(fp);
    			}
    A saída fica: Digite seu nome: Leonardo

    e no arquivo aparece: Nome=Leonardo

    É um pouco complicado explicar, mas o buffer só é escrito no teste.ini se só tiver 1 item, no caso, nome.
    As "tags" Nome e Idade foram usadas só como exemplo, desejo usar isso de outra forma, porém funciona da mesma forma que esse programa.

    teste.ini:
    Código PHP:
    Nome=
    Idade
    Como o programa deveria funcionar:
    Qual seu nome?
    Leonardo
    Qual sua idade?
    18
    e então finalizar e no teste.ini constaria:
    Nome=Leonardo
    Idade=18

    porém qd executo aparece:
    Qual seu nome?
    Leonardo
    Programa termina e não escreve no teste.ini

    IDE Utilizada: Visual studio 2013

    Thanks.
    Be who you want to be
    Be who you are
    Everyone's a hero
    Everyone's a star

  • Font Size
    #2
    Bom, pra começar gostaria de aconselhar a largar algumas funções velhas do C, e começar a migrar pro C++, que na minha opnião, tenderá a ocorrer menos erros.

    Substitua o "printf" por "cout <<"
    e o "gets" por "cin >>"

    outra coisa, aquele "fflush", significa "GRAVAR", e só pq vc não chama essa função não quer dizer que vai perder os dados... O que quero dizer?

    Quero dizer que vc deve deixar o fflush no final, da seguinte forma:

    if (strcmp(buff, "Nome=") == 0)
    {
    printf("Digite o seu nome: ");
    gets(asd);
    fputs(asd, fp);
    }

    if (strcmp(buff, "Idade=") == 0)
    {
    printf("Digite a sua Idade: ");
    gets(asd);
    fputs(asd, fp);
    }

    fflush(fp);
    Só não consegui entender nessa parte o porque de comparar o "buff" com "Idade" ou "Nome".
    sigpic

    Decidi deixar de ser usuário e virar desenvolvedor

    Comment


    • Font Size
      #3
      Opaa,
      Eu que optei por usar o printf e não o cout, isso não modificaria o funcionamento do programa...
      Ali tem um loop que só terminará quando o fim do arquivo for atingido, a cada fscanf que é dado uma nova palavra é comparada, se for encontrado a palavra "Nome=" o strcmp vai dar zero e entrará no bloco de comando do " if (strcmp(buff, "Nome=") == 0) "
      então o programa pedirá que eu insira o nome, e o escreverá com fputs, se eu colocar o fflush depois dos ifs dentro do while ficará tentando gravar coisas erradas no teste.ini, e se eu coloco pro fflush ser executado assim que sair do while ele grava um monte de coisas erradas no arquivo de texto. Assim sempre que uso o fputs uso o fflush para escrever somente o que eu digitei.

      Como disse ali, tem um arquivo chamado: teste.ini
      dentro dele tem:

      Nome=
      Idade=

      quero que o programa escreva no teste.ini

      Nome=O que eu digitar
      Idade= O que eu digitar

      só que quando eu tento executar o programa pede:

      Digite seu nome:
      eu digito, o programa fecha e não escreve no teste.ini ;x

      Para ficar mais claro o que estou dizendo seria bom se vc compilasse o arquivo no seu PC e então verá o erro.

      #Obrigado pela resposta.
      Be who you want to be
      Be who you are
      Everyone's a hero
      Everyone's a star

      Comment


      • Font Size
        #4
        Postado Originalmente por LMachado Ver Post
        Opaa,
        Para ficar mais claro o que estou dizendo seria bom se vc compilasse o arquivo no seu PC e então verá o erro.
        Blz, vou testar quando puder (agora estou no trabalho) e então se eu conseguir uma solução, posto aqui.
        sigpic

        Decidi deixar de ser usuário e virar desenvolvedor

        Comment

        X
        Working...
        X