• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

owny

guardar dados

15 mensagens neste tópico

boas pessoal!

Sou novo por estas bandas. Parabéns por este projecto parece-me bastante bom ;)

Tenho uma pequena questão que tenho a certeza que algum guru me saberá responder.

estou a fazer uma aplicação em win32(modo consola), e todos os dados que coloco gostaria que ficassem guardados num ficheiro ou numa base de dados para estarem sempre a incrementar os valores e nunca perder os registos. Será que me fiz entender?

Alguém me dá umas noções?

Obrigado,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Qual é a tua dúvida em concreto? Como criar um ficheiro? Como mandar os dados para o ficheiro?

Se fores um pouco mais específico é mais fácil ajudar ;)

Já agora, bem vindo!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Imaginem que faço uma aplicação para gerir filmes em que o utilizador diz quantos filmes quer introduzir e no fim mostra os filmes que foram introduzidos.

Imaginem que é tipo isto:

Quantos filmes quer armazenar?

2

Qual o nome do Filme?

Matrix

Qual o nome do Filme?

Barbie

Introduziu os Seguintes Filmes:

Matrix

Barbie

Mas queria os dados guardados para não se perderem cada vez que fecho a aplicação

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para isso basta teres um ficheiro de texto com o nome de um filme por linha...

FILE *fich = fopen("filmes.txt");
char[100] filme;

puts("Qual o nome do filme a inserir? ");
scanf("%99s", filme);
fprintf(fich, "%s\n", filme);

Isso é uma possível solução... Não é a melhor, não é a mais robusta, e falta verificar se ocorreu algum erro, mas é simples...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o puts é igual ao printf?

O ficheiro txt. tem que estar em que pasta? ou ele cria um novo automaticamente?

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
o puts é igual ao printf?

O puts() é parecido com o printf().

Ambos escrevem o(s) parametro(s) no stdout.

As diferenças são:

a) puts() acrescenta um '\n' à string

:) o valor de retorno do printf() (um int) se for positivo ou zero diz quantos caracteres ele escreveu, se for negativo indica erro; o valor de retorno do puts() (também um int) se for EOF indica erro, senão (necessariamente é >= zero) indica que correu tudo bem

Tirando o valor de retorno (que é ignorado neste snippet), as duas últimas instruções do código seguinte têm o mesmo efeito.

const char *msg = "Hello, World!";
printf("%s\n", msg);
puts(msg);

O ficheiro txt. tem que estar em que pasta? ou ele cria um novo automaticamente?

Não TEM que estar em pasta específica nenhuma (em princípio está na "directoria corrente"). É criado automaticamente ou não consoante o segundo parametro que passas para a função fopen().

http://www.opengroup.org/onlinepubs/007908799/xsh/fopen.html

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É criado automaticamente ou não consoante o segundo parametro que passas para a função fopen().

Exacto. Esqueci-me desse pormenor.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vou testar isso hoje a noite.

Uma outra questão:

- Como coloco caracteres especiais em linha de comandos?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uma outra questão:

- Como coloco caracteres especiais em linha de comandos?

O que é que queres dizer com "caracteres especiais"?

Suponho que estás a falar de Windows e do cmd.exe, certo?

Acho que alguns acentos, cedilhas, etc. são aceites normalmente ... ou queres meter todos os tipos de caracteres como eu faço no bash?

$ echo -e '\x00\x01\x02foo bar' | hd
00000000  00 01 02 66 6f 6f 20 62  61 72 0a                 |...foo bar.|
0000000b
$

Se queres a segunda hipótese, não sei ... mas podes sempre fazer um programeta a imitar o echo do bash :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim o que preciso é de colocar acentos nas palavras visto que isto vai correr em modo onsola.

Aqui está um exemplo:

#include <stdio.h>

void main()

{
printf("PROJECTO 2008\n \"Gestão de Espectáculos\"\n");
}

o que aparece na consola é:

PROJECTO 2008

"GestÒo de Espectßculos"

Ele fica com os acentos todos marados.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se fores à consola e fizeres "more program.c" (ou "type program.c") também te aparecem os gatafunhos, certo?

Se sim, acho que isso quer dizer que os charsets do source e da consola são diferentes.

A maneira mais prática é que o teu código fonte e a consola usem o mesmo charset (mas, noutro computador com outro charset, já vai dar gatafunhos) ou então, se descobrires qual é o código que cada caracter usa na consola podes escrever esse código no teu source

printf("Gest\xE3o de Espect\xE1culos\n");

Ou talvez te safes com setlocale(), que é do C99

http://www.opengroup.org/onlinepubs/007908799/xsh/setlocale.html

#include <locale.h>
#include <stdio.h>

int main(void) {
   setlocale(LC_ALL, "");
   printf("Gestão de Espectáculos\n");
   return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É um assunto para o qual já pensei mais que uma vez escrever um mini-tutorial. Infelizmente não tenho grande paciência para essas coisas... ::)

Não é um assunto trivial, implica mudar em certa parte a maneira de programar. É necessário utilizar outro tipo de variáveis, e converter texto para Unicode, isto para garantir que o código não dará problemas.

Dito isto, o seguinte resolve o problema (superficialmente! para que ficasse tudo como é devido (com suporte a Unicode) dava texto para muitas linhas) :

#include <stdio.h>
#include <locale.h>

int main() {
   setlocale(LC_ALL, "portuguese_portugal");
   printf("Olá Mundo!");
}

Só para comparar, o que interpreto como "o código que não dará problemas" seria algo como o seguinte:

#include <stdio.h>
#include <locale.h>
#include <TCHAR.h>

int _tmain() {
   _tsetlocale(LC_ALL, _T("portuguese_portugal"));
   _tprintf(_T("Olá Mundo!"));
}

em que os símbolos começados por _t são macros definidas em TCHAR.h:

- _tmain é expandida como main ou wmain;

- _tsetlocale é expandida como setlocale ou wsetlocale;

- _tprintf é expandida como printf ou wprintf;

- e _T() é expandida como a string que está entre os parêntesis, ou a sua representação em Unicode.

tudo isto conforme a aplicação esteja configurada para utilizar ASCII ou Unicode, respectivamente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

posso-vos adiantar que com o setlocale(LC_ALL, "portuguese_portugal"); funcionou :D :cheesygrin:

Ficou assim:

#include <stdio.h>
#include <locale.h>

void main()
{
setlocale(LC_ALL, "portuguese_portugal");
printf("PROJECTO 2008\n \"Gestão de Espectáculos\"\n");
}

Obrigado :)

Agora vou testar a parte de gravação do dados... já dou algum feedback :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já estou cansado não consigo pensar mais por hoje.

Aqui fica o que já fiz:

#include <stdio.h>
#include <locale.h>
#include <stdlib.h>

void main()
{
int opcao, num_filmes, i;
char filme;
//	FILE *fich = fopen("filmes.txt");
setlocale(LC_ALL, "portuguese_portugal");

printf("Escolha uma das seguintes opções:\n");
printf("1 - Deseja saber quais foram os filmes introduzidos\n");
printf("2 - Introduzir novo/s Filme/s\n");
printf("3 - Sair\n");
printf ("Numero da opção: ");
printf ("\n\n");
scanf("%d", &opcao);

switch (opcao) {
case 1:		printf("FILMES DO TXT - IMOMPLETO\n");
break;
case 2:		printf ("Quantos filmes deseja introduzir?\n");
			scanf("%d", &num_filmes);
			for (i=0; i<=num_filmes; i++)
			{
				printf("Introduza o nome do filme:\n");
				scanf("%99s", &filme);
			//	fprintf(fich, "%s\n", filme);
			}
break;
case 3:		printf ("SAIR");
break;
default:	printf ("Erro!");
break;
}

}

Tenho aqui umas duvidas que tem a ver com a forma de pensar:

- Caso o utilizador não coloque nenhuma opção das que estão listadas vai aparecer o texto: ERRO. Como volto a colocar automaticamente depois do ERRO o ecrã das opções iniciais?

- Como faço o programa ler os filmes que já estão no TXT?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

- Caso o utilizador não coloque nenhuma opção das que estão listadas vai aparecer o texto: ERRO. Como volto a colocar automaticamente depois do ERRO o ecrã das opções iniciais?

Coloca um while a abranger desde o 1º printf até ao fim do switch.

- Como faço o programa ler os filmes que já estão no TXT?

Abre o ficheiro para leitura com FILE * fichLeitura = fopen("filmes.txt", "r");, e usa o fscanf(fichLeitura, "%99[^\n]", filme);para ler cada uma das linhas.

Já agora, estás a declarar filme como um char, e tens que declarar como um array de chars. E falta o 2º parâmetro da função fopen que tens comentada.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora