C++ Output para txt fica diferente da consola!

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:

c.PNG
 
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. :)
 
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:
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.
 
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!
 
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.

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

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!


: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");
}
 
Back
Topo