Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

AndreLopes20

Criar ficheiro em c

Mensagens Recomendadas

AndreLopes20

Boas pessoal , tenho um trabalho da fac que nao faço a minima por onde começar porque sou novo nestas coisas e o que me é pedido para fazer é para implementar um programa em “C” que produza ficheiros contendo números inteiros aleatórios do tipo “long int”, onde os números aleatórios devem estar entre 0 e RAND_MAX. Devem fazer ficheiros com o seguinte número de inteiros aleatorios por exemplo : 50000. Este programa deve ter um parâmetro de entrada que é o numero de inteiros a produzir.

Como nao sei por onde começar, comecei a fazer o seguinte codigo :

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char * argv[])
{
 FILE *fp;
 fp = fopen("50000.c", "wb");
 argv[50000];
 fclose(fp);
}

Alguem me pode dar algumas dicas ?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

AndreLopes20,

Se isto é um trabalho da faculdade, e tendo em conta que o título do teu tópico é «Criar ficheiro em c», presumo que tenhas sido ensinado a criar ficheiros em C durante as aulas. O problema que estás a tentar resolver presume também que sabes fazer o seguinte:

  • criar/abrir ficheiros e escrever neles
  • gerar um número aleatório
  • aceitar argumentos na linha de comandos

O que sabes sobre os 3 elementos que referi?

Mais ainda, consegues explicar o código que colocaste acima? Isso é que era interessante saber.

Editado por pwseo

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AndreLopes20

Se eu soubesse todos esse topicos com certeza nao estava aqui a pedir ajuda , dai ter postado a minha duvida ... Se eu tivesse aprendido tudo isso tambem nao estaria aqui por isso , agradeço a mesma a tua ajuda. Obrigado.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

O que sabes sobre os 3 elementos que referi?

Mais ainda, consegues explicar o código que colocaste acima? Isso é que era interessante saber.

São coisas importantes para te ajudarmos sem fazermos o trabalho por ti.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AndreLopes20

O problema é que eu nao sei nada sobre esses 3 elementos que referiste ... se me puderes dar uma ajuda de como começar , eu nao preciso que faças o trabalho por mim só queria uma ajuda por onde começar .

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Como é que não sabes nada sobre esses 3 elementos? Se estás no final do semestre, seguramente tens apontamentos / material das aulas onde te falam nisso, pelo menos uma ideia (ainda que vaga) deves ter sobre o assunto.

Algo que fale em fopen(), rand() e argv.

Falta a parte em que explicas o que faz o código que colocaste acima.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AndreLopes20

Eu sei que estou , mas nunca ouvi falar sobre o argv por exemplo ...

é que isto é para uma cadeira de sistemas operativos e nao de programação , pelo que fazer este codigo para depois utilizarmos no terminal é aquilo que eu nao percebo.

Nos criamos ficheiros em c++ e aqui em c nao percebo se é suposto fazer o mesmo

Editado por AndreLopes20

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Falta a parte em que explicas o que faz o código que colocaste acima.

Eu sei que estou , mas nunca ouvi falar sobre o argv por exemplo ...

No entanto, tens o argv no código que escreveste. Tens algum exemplo de como executar o programa? Sabes se o número de inteiros a gerar é para ser recebido através de um argumento na linha de comandos ou dentro do programa mesmo?

Até agora não avançámos nada porque não nos explicaste ainda o que sabes sobre aqueles 3 temas. Se eu pedir para criares um ficheiro em C, sabes fazê-lo? (ou seja, utilizar a função fopen()). E gerar um número aleatório? (função rand()).

A documentação dessas funções está amplamente disponível, assim como exemplos da sua utilização. Dá uma olhadela e começa a estruturar o programa, que colocarás aqui.

Se quiseres começar de forma mesmo simples, faz o seguinte:

  • Assume que vais gerar sempre o mesmo número de long ints (por exemplo, 100)
  • Em vez de escreveres os números num ficheiro, escreve-os no ecrã (depois é fácil trocar isso)

Assim só tens que gerar os números sem te preocupares com o resto. Fico à espera de desenvolvimentos.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AndreLopes20

Nao tenho nenhum exemplo , simplesmente tenho algumas dicas que o stor foi dando por isso é que coloquei naquele codigo la em sima o argv porque ele disse que era necessario para fazer esse mesmo codigo... Quanto ao numero de inteiros a gerar é suposto ser pela linha de comandos porque é pedido para gerar varios numeros inteiros , por exemplo um com 50 e outro com 100 e esse codigo servia para ambos.

Eu sei gerar numeros aleatorios em C e sei criar ficheiros, penso eu que sei ...

Quanto ao codigo que fiz , criei um file com o nome 50000.c e lá dentor coloquei um array com 50000 numeros.

Vou entao começar a fazer aqueles primeiros passos que disseste e ja coloco aqui

Editado por AndreLopes20

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AndreLopes20

int main(void) {
int random_num, count;
srand(time(NULL));
char nums[100];
for (count = 0; count < 100; count++) {
 nums[count] = rand();
}
for (count = 0; count < 100; count++) {
 printf("%d\t", nums[count]);
}
return 0;
}

Esta aqui o codigo que pediste que fizesse para gerar sempre o mesmo numero de inteiros.

Editado por AndreLopes20

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Óptimo. Um pormenor: o teu código não está indentado: corrige isso.

Agora podemos pensar na fase seguinte: em vez de imprimir isso no ecrã.

  • Como se chama o ficheiro no qual tens que escrever os números?
  • Sabes utilizar a fopen()?
  • Em vez de printf() terás que utilizar fprintf() -- consulta a documentação para perceberes como utilizar

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AndreLopes20

int main(void) {
FILE *fp;
int result;
long int random_num, count;
fp = fopen("50000.dat","wb");

if (fp == NULL)
{
 printf("Problemas na abertura do arquivo\n");
 return 0;
}


srand((unsigned)time(NULL));
char nums[100];
for (count = 0; count < 100; count++) {
 nums[count] = rand();
}
for (count = 0; count < 100; count++) {
 printf("%d\t", nums[count]);

}

return 0;
result = fwrite(&nums[count], sizeof(long int), 100, fp);
printf("Numero de elementos gravados:%d",result);
fclose(fp);
}

Fiz este codigo ... é assim ?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Fiz este codigo ... é assim ?

A pergunta correcta é: ele está a fazer o que pretendes?

Indenta o teu código... Assim é mais chato para se perceber.

E já que vais editá-lo, utiliza comentários para explicares o que está a ser feito em cada linha (não em todas, nas mais importantes apenas). Só assim saberás o que está mal.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AndreLopes20

Por um lado sim por outro lado nao , porque nao estou a usar o argv nem o argc no main que era aquilo que o nosso prof queria ... para fazer isso é preciso mudar muita coisa desse codigo ?

é que eu nao percebo o porque de termos que utilizar esses argv e argc

int main(void)
{
FILE *fp;
int result;
long int i;
fp = fopen("50000.dat","wb"); //abre o ficheiro

if (fp == NULL)
{
 printf("Problemas na abertura do arquivo\n");
 return 0;
}


srand((unsigned)time(NULL));
long int nums[100]; // array 100

nums[i] = rand(); //gerar 100 numeros aleatorios

printf("%d\t", nums[i]);

result = fwrite(&nums[i], sizeof(long int), 100, fp);
printf("Numero de elementos gravados:%d",result);
fclose(fp); // fecha o ficheiro
}

Editado por AndreLopes20

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Experimenta usar code=c e /code nas tags quando inserires código.

Fica muito melhor:

int main(void){
 FILE *fp;
 int result;
 long int i;

 fp = fopen("50000.dat","wb"); //abre o ficheiro

 if (fp == NULL){
   printf("Problemas na abertura do arquivo\n");
   return 0;
 }


 srand((unsigned)time(NULL));
 long int nums[100]; // array 100

 nums[i] = rand(); //gerar 100 numeros aleatorios

 printf("%d\t", nums[i]);

 result = fwrite(&nums[i], sizeof(long int), 100, fp);
 printf("Numero de elementos gravados:%d",result);
 fclose(fp); // fecha o ficheiro
}

Sobre o código, sem ter grande experiência, posso dizer uma coisa ou outra que talvez possa facilitar numa fase inicial!

Cria o ficheiro em formato normal. Assim sempre podes editar o ficheiro e ver o que está lá dentro em plain text!

O teu compilador não se queixa de usares variáveis não inicializadas? Se usares a variável i como está, que valor ela contém a primeira vez que for acedida??? Para além disto, neste contexto, não faz sentido usares um índice numa variável que é uma array sem um loop.

A linha

  nums[i] = rand(); //gerar 100 numeros aleatorios

não gera 100 números aleatórios. Gera apenas um! Precisas de um loop.

Não sei se era tua intenção não usares loops para preencheres a array, mas se era, então ignora o que eu disse!

  • Voto 1

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

AndreLopes20,

Todas as questões levantadas pelo PsySc0rpi0n são muito pertinentes. Ainda assim, parece-me que são coisas que não compreendes. Aliás, desde o teu código anterior até este último deste um salto de complexidade que não se compreende: deverias ter apenas utilizado fopen() e fprintf(). Por esse motivo, vamos voltar atrás.

Diz-nos uma coisa: que compilador estás a utilizar? (e já agora, em que sistema operativo?)

Voltemos ao teu código anterior (que eu indentei porque estou farto de ver código alinhado à esquerda):

int main(void) {
   int random_num, count;    /* para que é 'random_num'?         */
   srand(time(NULL));        /* sabes para que serve esta linha? */
   char nums[100];           /* precisas mesmo disto?            */

   /* Faz sentido armazenar 100 números em memória?... */
   for (count = 0; count < 100; count++) {
       nums[count] = rand();
   }

   /* ...por que motivo não os imprimes logo que os geras? */
   for (count = 0; count < 100; count++) {
       printf("%d\t", nums[count]);
   }

   /* Se usares C99 isto é desnecessário */
   return 0;
}

Lê bem os comentários que deixei. Pensa bem no que estás a fazer. Achas que faz sentido gerar 100 números e guardá-los em memória para depois simplesmente imprimires os 100 números? Não seria melhor imprimir cada número à medida que os vais gerando?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

...

Lê bem os comentários que deixei. Pensa bem no que estás a fazer. Achas que faz sentido gerar 100 números e guardá-los em memória para depois simplesmente imprimires os 100 números? Não seria melhor imprimir cada número à medida que os vais gerando?

Bom dia @pwseo e OP.

Eu fiz a minha própria versão do programa e foi essa a minha abordagem! Cada valor gerado foi imediatamente imprimido no ficheiro.

E depois de ver os teus comments no code dele, se calhar ainda dá para fazer em menos linhas que aquilo que eu fiz!

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Flinger

Por um lado sim por outro lado nao , porque nao estou a usar o argv nem o argc no main que era aquilo que o nosso prof queria ... para fazer isso é preciso mudar muita coisa desse codigo ?

é que eu nao percebo o porque de termos que utilizar esses argv e argc

o argc e o argv são a forma de controlar os argumentos que são passados ao teu programa. Pedir ao utilizador que introduza a quantidade de números a gerar é uma boa opção se o teu programa for utilizado por uma pessoa. E se for usado por um script? Ou se for usado por um outro programa? Se passares a quantidade como argumento na linha de comandos então tens o problema resolvido.

Quanto à explicação de como usar, fica para mais tarde, quando atinares com o resto do programa. Não vale a pena complicar muito a coisa agora.

Um aparte para quem ajuda. Primeiro as pessoas devem aprender a programar, só depois é que faz sentido optimizar. Não compliquem o raciocínio tentando fazer o código no menor número de linhas possível.

E os standards são porreiros para facilitar a vida a quem sabe o que está a fazer. Eu sou da opinião que se deve começar com ANSI puro. Começar a tirar returns sem perceber direito porque eles estão lá só ajuda a complicar. Colocá-los sempre, mesmo quando não é necessário ajuda a automatizar, e evita complicações no futuro.

Por favor, não levem a mal, a malta que já sabe às vezes esquece-se das dificuldades que tem quem está a aprender.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AndreLopes20

Entao por onde devo começar

CRLF ? Estou realmente perdido no meio disto tudo e a data de entrega esta a apertar ...

Obrigado a todos pela ajuda , vou começar a estruturar outra vez o programa e peço que me ajudem no que poderem

Editado por AndreLopes20

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Entao por onde devo começar

CRLF ? Estou realmente perdido no meio disto tudo e a data de entrega esta a apertar ...

Obrigado a todos pela ajuda , vou começar a estruturar outra vez o programa e peço que me ajudem no que poderem

Eu começava por descrever por tópicos o que o programa precisa. Algo assim:

Abrir um ficheiro

Perguntar quantos valores aleatórios é preciso gerar

Gerar esse número de valores aleatórios e guardá-los algures (ou não, podemos escrevê-los logo no file)

Agora é necessário fazer algumas considerações de como o algoritmo vai (ou pode ser) implementado.

Tal como o Flinger disse, podemos perguntar ao user o número de valores aleatórios a gerar ou então passar essa informação directamente pela linha de commandos, tal como o nome do ficheiro! (Esta última foi a minha abordagem da versão que fiz)

Ou seja, quando executamos o programa, faze-lo desta forma (ou parecido):

./programa numeros.dat 50000

Neste caso, iria ser criado um ficheiro com o nome "números.dat" e iria gerar 50000 números aleatórios!

Em termos de programação, vamos, hipoteticamente, precisar de talvez 3 ou 4 blocos de código. Nem há necessidade de fazer funções, na minha opinião.

1 bloco de código para verificar se os parâmetros passados pela linha de commandos estão correctos (argc)

1 bloco de código para abrir a stream para ficheiro e verificar que foi aberto correctamente (argv, fopen)

1 bloco de código para gerar o número de valores aleatórios passados pela linha de commandos (argv, srand e rand)

1 bloco de código para gravar os valores aleatórios gerados no ficheiro (opcional, pode ser tudo incluido no bloco anterior) (fprintf)

1 bloco de código para fechar a stream do ficheiro (fclose)

Para não estares empancado e não dizeres que não te deram nenhuma ajuda útli, o argc e o argv são duas variáveis que são usadas para controlar/aceder aos parâmetros passados pela linha de comandos.

O argc contém o número de parâmetros passados pela linha de comandos ao programa, incluindo o nome do programa e o argv é uma array que contém esses parâmetros.

Agora pesquisa um pouco sobre as duas variáveis e lê. Não podemos fazer o trabalho por ti!

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Flinger

Entao por onde devo começar

CRLF ?

Não começas, continuas. Continuas a fazer o que estavas a fazer, a tentar gerar os números e a guardá-los no ficheiro. Quando tiveres isso logo te preocupas com os argumentos.

AndreLopes20,

Todas as questões levantadas pelo PsySc0rpi0n são muito pertinentes. Ainda assim, parece-me que são coisas que não compreendes. Aliás, desde o teu código anterior até este último deste um salto de complexidade que não se compreende: deverias ter apenas utilizado fopen() e fprintf(). Por esse motivo, vamos voltar atrás.

Diz-nos uma coisa: que compilador estás a utilizar? (e já agora, em que sistema operativo?)

Voltemos ao teu código anterior (que eu indentei porque estou farto de ver código alinhado à esquerda):

int main(void) {
int random_num, count;	/* para que é 'random_num'?		 */
srand(time(NULL));		/* sabes para que serve esta linha? */
char nums[100];		   /* precisas mesmo disto?			*/

/* Faz sentido armazenar 100 números em memória?... */
for (count = 0; count < 100; count++) {
	nums[count] = rand();
}

/* ...por que motivo não os imprimes logo que os geras? */
for (count = 0; count < 100; count++) {
	printf("%d\t", nums[count]);
}

/* Se usares C99 isto é desnecessário */
return 0;
}

Lê bem os comentários que deixei. Pensa bem no que estás a fazer. Achas que faz sentido gerar 100 números e guardá-los em memória para depois simplesmente imprimires os 100 números? Não seria melhor imprimir cada número à medida que os vais gerando?

Continuas daqui.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AndreLopes20

Boas malta , comecei entao a estruturar uma parte do trabalho e é mais ou menos isto ou tudo o que fiz ate agora esta mal ?


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main (int argc, char *argv[])
{
int numeros;
char* numerosaleatorio [];
FILE *fp;

fp = fopen("numerosaleatorios.txt","w+");
fprint (fp, "Numeros Aleatorios: %s",argv[1]);
if (argc == 2) //Testa se o numero de parametros fornecidos esta correto , uma
vez que o primeiro vai ser o nome do programa e o segundo vai ser a quantidade de numeros
aleatorios que vao ser criados;

{
numeros = atoi (argv[1]); //argv contem strings que se referem ao
numero de numeros a gerem gerados, recebendo assi uma string e transformando num inteiro
equivalente;

}
fclose(fp);
getchar();
return 0;
}

Editado por AndreLopes20

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Identa o código e usa as tags como já te foi dito.

Já testaste o código?

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.