Ir para o conteúdo
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

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

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

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

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.