1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

C++ Output para txt fica diferente da consola!

Discussão em 'Programação' iniciada por Make.Love, 16 de Setembro de 2007. (Respostas: 6; Visualizações: 1302)

  1. Make.Love

    Make.Love Banido

    Viva a todos :)

    tou aqui com um pequeno problema, é o seguinte:

    Queria fazer o output dos dados tal como aparecem na consola para um ficheiro txt, a abertura, escrita, etc dos dados ja esta feita, no entanto a formatação da string para o ficheiro n aparece correcta, nem os dados ficam nas linhas e colunas como na consola.

    Se alguém puder dar uma ajuda agradecia.

    :)

    Código:
    #include "stdafx.h"
    #include "stdlib.h"
    #include "stdio.h"
    
    
    struct Pessoa
    {
    	char nome[20];
    	char morada[50];
    	char telefone[15];
    };
    
    const int nrPessoas = 20;
    Pessoa listaPessoas[nrPessoas];
    
    void imprimirMenu()
    {
    	system("cls");
    	printf("*******************************\n");
    	printf("* Tratamento de Contactos     *\n");
    	printf("*******************************\n");
    	printf("* Digite:                     *\n");
    	printf("* 1 - Introduzir dados        *\n");
    	printf("* 2 - Ver tabela              *\n");
    	printf("* Outra - Sair                *\n");
    	printf("*******************************\n");
    }
    
    void lerDados()
    {
    	FILE *ficheiro_input;
    	if ((ficheiro_input = fopen("e:\lista.telefonica.dados.txt", "w")) == NULL)
    	fprintf(stderr, "Não pode abrir %s\n", "e:\lista.telefonica.dados.txt");
    	char c;
    	while ((c = getc(ficheiro_input)) != EOF)
    	{
    		printf("%c", c);
    	} 
    	fclose(ficheiro_input);
    }
    void guardarDados()
    {
    	FILE *ficheiro_output;
    	if ((ficheiro_output = fopen("e:\lista.dados.txt", "w")) == NULL)
    	{
    		fprintf(stderr, "Não pode abrir %s\n", "e:\lista.dados.txt");
    	}
    	fclose(ficheiro_output);
    }
    void imprimirStringFormatada(char expressao[], int limite)
    {
    	int k = 0;
    	while (expressao[k] != 0)
    	{
    		printf("%c", expressao[k]);
    		k++;
    	}
    	for (int j=k; j<limite; j++)
    	{
    		printf(" ");
    	}
    }
    void imprimirStringFormatada2(char expressao[], int limite)
    {
    	FILE *ficheiro_output;
    	ficheiro_output = fopen("e:\lista.dados.txt", "r");
    	int k = 0;
    	while (expressao[k] != 0)
    	{
    		fprintf(ficheiro_output,"%c", expressao[k]);
    		k++;
    	}
    	for (int j=k; j<limite; j++)
    	{
    		fprintf(ficheiro_output," ");
    	}
    }
    void mostrarTabela()
    {
    	system("cls");
    	printf("|---------------------------------------------------------------------------|\n");
    	printf("|NOME               |MORADA                                    |TELEFONE    |\n");
    	printf("|---------------------------------------------------------------------------|\n");
    	for (int i = 0; i < nrPessoas; i++)
    	{
    		Pessoa p = listaPessoas[i];
    		printf("|");
    		imprimirStringFormatada(p.nome, 19);
    		printf("|");
    		imprimirStringFormatada(p.morada, 42);
    		printf("|");
    		imprimirStringFormatada(p.telefone, 12);
    		printf("|");
    		printf("\n");
    	}
    	printf("|---------------------------------------------------------------------------|\n");
    	printf("Prima Enter para voltar ao Menu");
    	char opcao[2];
    	gets(opcao);
    }
    void obterDados()
    {			
    	{
    		FILE *ficheiro_output;
    		ficheiro_output = fopen("e:\lista.dados.txt", "w");
    		if (ficheiro_output == NULL)
    			fprintf(stderr, "Nao pode abrir %s\n", "e:\lista.dados.txt");
    		else
    		{ 
    			printf("Ficheiro $s aberto com sucesso!!!\n", "e:\lista.dados.txt");
    		}
    
    		Pessoa p;
    		printf("Digite o nome:");
    		gets(p.nome);
    		fprintf(ficheiro_output,"%s", p.nome);
    
    		printf("Digite a morada:");
    		gets(p.morada);
    		fprintf(ficheiro_output,"%s", p.morada);
    
    		printf("Digite o telefone:");
    		gets(p.telefone);
    		fprintf(ficheiro_output,"%s", p.telefone);
    
    		fprintf(ficheiro_output, "\n");
    		
    		fprintf(ficheiro_output,"|---------------------------------------------------------------------------|\n");
    		fprintf(ficheiro_output,"|NOME               |MORADA                                    |TELEFONE    |\n");
    		fprintf(ficheiro_output,"|---------------------------------------------------------------------------|\n");
    		
    		for (int i = 0; i < nrPessoas; i++)
    		{
    			Pessoa p = listaPessoas[i];
    			fprintf(ficheiro_output,"|");
    			imprimirStringFormatada2(p.nome, 19);
    			fprintf(ficheiro_output,"|");
    			imprimirStringFormatada2(p.morada, 42);
    			fprintf(ficheiro_output,"|");
    			imprimirStringFormatada2(p.telefone, 12);
    			fprintf(ficheiro_output,"|");
    			fprintf(ficheiro_output,"\n");
    		}
    		fprintf(ficheiro_output,"|---------------------------------------------------------------------------|\n");
    
    		int i = 0;
    		while (listaPessoas[i].nome[0] != 0)
    		{
    			i++;
    		} 
    		
    		if (i<nrPessoas) // só pode colocar no vector se o vector tiver espaço
    		{
    			listaPessoas[i] = p;
    		}
    	}
    }
    
    
    
    //void bubble_sort()
    //{
    //	while (true)
    //	{
    //		bool trocou = false;
    //		for (int i=0; i< listsize; i++)
    //		{
    //			if (comparar(lista[i], lista[i + 1]) == 1) //Se estão naordem inversa
    //			{	
    //				trocar(i,i+1);
    //				trocou = true; // Como houve pelo menos uma
    //								// troca a lista pode não estar ordenada
    //			}
    //		} 
    //		if (trocou == false) // Se não houve nenhuma troca a lista está já ordenada
    //			return;
    //	}
    //}
    
    void main()
    {	
    	bool continuar = true;
    	char opcao[2];
    	while (continuar)
    	{
    		imprimirMenu();
    		gets(opcao);
    		if (opcao[0] == '1')
    		{	obterDados();
    		    guardarDados();
    		}
    		else if (opcao[0] == '2')
    			mostrarTabela();
    		else
    			continuar = false;
    	}
    }
    Já nao sei mesmo o que fazer... :(

    Fica aqui o output:

    [​IMG]
     
  2. shello

    shello Moderador
    Staff Member

    Quando estás a obter os dados estás a fazer fprintf() logo a seguir ao utilizador os introduzir... Será disso?
     
  3. Make.Love

    Make.Love Banido

    pelo que entendi assim que faz o get dos dados introduzidos pelo utilizador faz fprint para memoria e so quando fecha a aplicaçao é que é feita a escrita para o txt.

    Aceito tambem formas diferentes para tratar o mesmo caso. :)
     
  4. vorenus

    vorenus Power Member

    Código:
    #include "stdafx.h"
    #include "stdlib.h"
    #include "stdio.h"
    
    
    struct Pessoa
    {
        char nome[20];
        char morada[50];
        char telefone[15];
    };
    
    const int nrPessoas = 20;
    Pessoa listaPessoas[nrPessoas];
    
    void imprimirMenu()
    {
        system("cls");
        printf("*******************************\n");
        printf("* Tratamento de Contactos     *\n");
        printf("*******************************\n");
        printf("* Digite:                     *\n");
        printf("* 1 - Introduzir dados        *\n");
        printf("* 2 - Ver tabela              *\n");
        printf("* Outra - Sair                *\n");
        printf("*******************************\n");
    }
    
    void lerDados()
    {
        FILE *ficheiro_input;
        if ((ficheiro_input = fopen("e:\lista.telefonica.dados.txt", "w")) == NULL)
        fprintf(stderr, "Não pode abrir %s\n", "e:\lista.telefonica.dados.txt");
        char c;
        while ((c = getc(ficheiro_input)) != EOF)
        {
            printf("%c", c);
        } 
        fclose(ficheiro_input);
    }
    void guardarDados()
    {
        FILE *ficheiro_output;
        if ((ficheiro_output = fopen("e:\lista.dados.txt", "w")) == NULL)
        {
            fprintf(stderr, "Não pode abrir %s\n", "e:\lista.dados.txt");
        }
        fclose(ficheiro_output);
    }
    void imprimirStringFormatada(char expressao[], int limite)
    {
        int k = 0;
        while (expressao[k] != 0)
        {
            printf("%c", expressao[k]);
            k++;
        }
        for (int j=k; j<limite; j++)
        {
            printf(" ");
        }
    }
    void imprimirStringFormatada2(char expressao[], int limite)
    {
        FILE *ficheiro_output;
        ficheiro_output = fopen("e:\lista.dados.txt", "r");
        int k = 0;
        while (expressao[k] != 0)
        {
            fprintf(ficheiro_output,"%c", expressao[k]);
            k++;
        }
        for (int j=k; j<limite; j++)
        {
            fprintf(ficheiro_output," ");
        }
    }
    void mostrarTabela()
    {
        system("cls");
        printf("|---------------------------------------------------------------------------|\n");
        printf("|NOME               |MORADA                                    |TELEFONE    |\n");
        printf("|---------------------------------------------------------------------------|\n");
        for (int i = 0; i < nrPessoas; i++)
        {
            Pessoa p = listaPessoas[i];
            printf("|");
            imprimirStringFormatada(p.nome, 19);
            printf("|");
            imprimirStringFormatada(p.morada, 42);
            printf("|");
            imprimirStringFormatada(p.telefone, 12);
            printf("|");
            printf("\n");
        }
        printf("|---------------------------------------------------------------------------|\n");
        printf("Prima Enter para voltar ao Menu");
        char opcao[2];
        gets(opcao);
    }
    void obterDados()
    {            
        {
            FILE *ficheiro_output;
            ficheiro_output = fopen("e:\lista.dados.txt", "w");
            if (ficheiro_output == NULL)
                fprintf(stderr, "Nao pode abrir %s\n", "e:\lista.dados.txt");
            else
            { 
                printf("Ficheiro $s aberto com sucesso!!!\n", "e:\lista.dados.txt");
            }
    
            Pessoa p;
            printf("Digite o nome:");
            gets(p.nome);
            [B][COLOR=Yellow]fprintf(ficheiro_output,"%s", p.nome);[/COLOR][/B]
    
            printf("Digite a morada:");
            gets(p.morada);
           [B] [COLOR=Yellow]fprintf(ficheiro_output,"%s", p.morada);[/COLOR][/B]
    
            printf("Digite o telefone:");
            gets(p.telefone);
            [B][COLOR=Yellow]fprintf(ficheiro_output,"%s", p.telefone);[/COLOR][/B]
    [COLOR=Yellow][B]
            fprintf(ficheiro_output, "\n");[/B][/COLOR]
            
            fprintf(ficheiro_output,"|---------------------------------------------------------------------------|\n");
            fprintf(ficheiro_output,"|NOME               |MORADA                                    |TELEFONE    |\n");
            fprintf(ficheiro_output,"|---------------------------------------------------------------------------|\n");
            
            for (int i = 0; i < nrPessoas; i++)
            {
                Pessoa p = listaPessoas[i];
                fprintf(ficheiro_output,"|");
                imprimirStringFormatada2(p.nome, 19);
                fprintf(ficheiro_output,"|");
                imprimirStringFormatada2(p.morada, 42);
                fprintf(ficheiro_output,"|");
                imprimirStringFormatada2(p.telefone, 12);
                fprintf(ficheiro_output,"|");
                fprintf(ficheiro_output,"\n");
            }
            fprintf(ficheiro_output,"|---------------------------------------------------------------------------|\n");
    
            int i = 0;
            while (listaPessoas[i].nome[0] != 0)
            {
                i++;
            } 
            
            if (i<nrPessoas) // só pode colocar no vector se o vector tiver espaço
            {
                listaPessoas[i] = p;
            }
        }
    }
    
    
    
    //void bubble_sort()
    //{
    //    while (true)
    //    {
    //        bool trocou = false;
    //        for (int i=0; i< listsize; i++)
    //        {
    //            if (comparar(lista[i], lista[i + 1]) == 1) //Se estão naordem inversa
    //            {    
    //                trocar(i,i+1);
    //                trocou = true; // Como houve pelo menos uma
    //                                // troca a lista pode não estar ordenada
    //            }
    //        } 
    //        if (trocou == false) // Se não houve nenhuma troca a lista está já ordenada
    //            return;
    //    }
    //}
    
    void main()
    {    
        bool continuar = true;
        char opcao[2];
        while (continuar)
        {
            imprimirMenu();
            gets(opcao);
            if (opcao[0] == '1')
            {    obterDados();
                guardarDados();
            }
            else if (opcao[0] == '2')
                mostrarTabela();
            else
                continuar = false;
        }
    }
    Já nao sei mesmo o que fazer... :(

    [/quote]

    o teu erro esta na parte em que alterei a cor

    tens que retirar essas linhas , pois so vai memorizar os ultimos dados que introduzes

    do meu ponto de vista a solucao é:

    teras que colocar esses dados num array de forma a que no ciclo for (que ja tens implementado) corras o array todo e envies ai os dados pro ficheiro

    penso que me fiz entender.. :)
     
    Última edição: 17 de Setembro de 2007
  5. Make.Love

    Make.Love Banido

    em primeiro lugar quero agradecer aqueles que leram e principalmente aqueles que deixaram o seu testemunho! :)

    vorenus, um grande obrigado, depois de tantas linha ja tava a ficar baralhado, realmente o fprintf estava a aparecer antes do ciclo for, o que estava errado.

    Entendi perfeitamente a ideia de ciclo, vamos la ver é se consigo articular o código todo! :P

    obg.
     
  6. greatbunzinni

    greatbunzinni Power Member

    Aqui vão uns apontamentos para melhorares o teu código:


    Código:
    [COLOR=Red]#include "stdafx.h"
    
    #include "stdlib.h"
    #include "stdio.h"[/COLOR]
    
    O cabeçalho stdafx.h é um artifício específico dos IDEs da Microsoft. Não é definido em nenhuma norma de C e se tentares compilar isso noutro compilador além de um da microsoft, isso dá erro e ficas agarrado ao pau.

    Os cabeçalhos stdlib.h e stdio.h não são ficheiros locais. São cabeçalhos de sistema. Toca a inclui-los como tal.

    Código:
    [COLOR=Red]void main()
    [/COLOR]
    Ai ai ai! Isso está mal! A função main tem sempre de devolver um int e só aceita dois parâmetros! void main() não existe em lado nenhum. Só existe int main(void) ou int main(int, char **) É uma violação descarada das normas, pá! Nada bonito!
     
  7. Make.Love

    Make.Love Banido

    ja tinha reparado nisso quanto precisei utilizar o dev c++. Neste momento estou com o Visual Studio, tal como referido.


    :sad:já esta corrigido, obrigado pelas dicas! :)


    Aproveito para acrescentar o codigo que alterei para a formataçao dos dados para o txt.

    Código:
    void imprimirStringFormatada2(char expressao[],int limite, FILE *ficheiro_output )
    {
    	
    	int k = 0;
    	while (expressao[k] != 0)
    	{
    		fprintf(ficheiro_output,"%c", expressao[k]);
    		k++;
    	}
    	for (int j=k; j<limite; j++)
    	{
    		fprintf(ficheiro_output," ");
    	}
    }
    
    void ficheiroTabela()
    {
    	FILE *ficheiro_output;
    	ficheiro_output = fopen("e:\lista.dados.txt", "w");
    	fprintf(ficheiro_output,"|-------------------------------------------------------------------------------|\n");
    	fprintf(ficheiro_output,"|NOME                   |MORADA                                    |TELEFONE    |\n");
    	fprintf(ficheiro_output,"|-------------------------------------------------------------------------------|\n");
    	
    	for (int i = 0; i < nrPessoas; i++)
    	{
    		Pessoa p = listaPessoas[i];
    
    		fprintf(ficheiro_output,"|");
    		fprintf(ficheiro_output,"%s", p.nome);
    		imprimirStringFormatada2(p.nome,20,ficheiro_output);
    		
    		fprintf(ficheiro_output,"|");
    		fprintf(ficheiro_output,"%s", p.morada);
    		imprimirStringFormatada2(p.morada,30,ficheiro_output);
    
    		fprintf(ficheiro_output,"|");
    		fprintf(ficheiro_output,"%s", p.telefone);
    		imprimirStringFormatada2(p.telefone,12,ficheiro_output);
    		
    		fprintf(ficheiro_output,"|");
    		fprintf(ficheiro_output,"\n");
    	}
    	fprintf(ficheiro_output,"|---------------------------------------------------------------------------|\n");
    }
     

Partilhar esta Página