Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

jesseufrrj

Arquivos em C

Recommended Posts

Fala galera, preciso fazer um pequeno programa pra simular uma caixa, usando struct, alocação dinamica, arquivos e tal.

 

Como faço pra salvar diversas entradas em um determinado arquivo ?
No meu código, eu to pedindo pro usuário cadastrar os produtos através de uma struct produto(codigo, nome e valor do produto), eis a bosta que eu to tentando fazer haha Dicas por favor, obrigado !!

 

Acabei não usando a variável struct hehe

 

#include <stdio.h>
#include <conio.h>
struct produtos{
int id;
char nome[30];
float preco;
};
int main()
{
FILE *pont_arq;
int codigos[100];
pont_arq = fopen("arquivo_informacao_prod.txt", "w");
if(pont_arq == NULL)
{
printf("Erro na abertura do arquivo!");
printf("\n");
return 0;
}
printf("Escreva os codigos dos produtos que serão cadastrados: ");
scanf("%s", &codigos);
fprintf(pont_arq, "%s", codigos);
fclose(pont_arq);
printf("Códigos gravados com sucesso!");
getch();
return(0);
}

 

Quando compila, eu digito um número e encerra o programa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como assimm diversas entradas? Escolha um formato (tipo CSV) e salve uma em cada linha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Sou iniciante e vou tentar lhe ajudar . . .

 

Olha eu fiz algumas alterações no seu codigo pelo que eu pude aprender de C ate agora, só não me peça detalhes mais tecnicos:

#include <stdio.h>

int main()

{

  FILE *pont_arq;

  int codigos [ 10 ];

  pont_arq = fopen ( "arquivo_informacao_prod.txt", "w" );

  if ( pont_arq == NULL )
    {
       printf ( "Erro na abertura do arquivo!" );
       printf ( "\n" );
       exit(1);
    }

  int g = 0;

  for ( g = 0; g <= 9; g++ )
     {
        printf ( "Escreva os codigos dos produtos que serão cadastrados: " );
        scanf ( "%d", &codigos [ g ] );
     }

  int h = 0;

  for ( h = 0; h <= 9; h++ )
     {
        fprintf ( pont_arq, "\n%d\n", codigos [ h ] );
     }

  fclose ( pont_arq );

  printf ( "Códigos gravados com sucesso!" );

  getchar ();

  return ( 0 );
}

- Quando você usou " fopen ( "arquivo_informacao_prod.txt", "w" ); " bom tenho certeza que para você ter desenvolvido este codigo, sabe que o conteudo gravado anteriormente vai ser apagado assim que você reexecutar o programa e tentar gravar algo novo, bom foi só um lembre.

 

- Com relação ao return 0; que você usou no if, a não ser que eu esteja errado, este codigo deve ser usado principalmente quando você deseja encerar o programa e principalmente dizendo que o mesmo foi encerrado NORMALMENTE, neste caso o correto seria exit(1); onde o programa indicaria que o mesmo foi forçado a ser encerrado por causa de algum erro.

 

- Pelo que pude entender sobre o seu codigo, você vai ter que criar dois laços " for ", o primeiro para a entrada de dados para serem armazenados no vetor dentro do programa, e o segundo para a gravação dos dados armazenados no vetor para dentro do arquivo, apenas observando que no segundo " for " eu coloquei \n para pular linhas no arquivo.

 

- No lugar de gech(); coloque getchar(); e pelo que sei a não ser que você vá usar algum componente muito especifico e necessario de " conio.h " tente evitar usar está biblioteca, alem de ser obsoleta, pode atrapalhar a portabilidade do codigo . . .

 

Bom por hora é só . . .

 

 

Ubuntu 14.04 GNU GCC 4.8 CodeBlocks 13.12

 

 

Espero Ter Ajudado ! ! !

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

Com relação ao return 0; que você usou no if, a não ser que eu esteja errado, este codigo deve ser usado principalmente quando você deseja encerar o programa e principalmente dizendo que o mesmo foi encerrado NORMALMENTE, neste caso o correto seria exit(1); onde o programa indicaria que o mesmo foi forçado a ser encerrado por causa de algum erro.

Não. A função exit também indica término normal.

7.20.4.3 The exit function

Description
2 The exit function causes normal program termination to occur. If more than one call to the exit function is executed by a program, the behavior is undefined.

 

O que aparentemente confunde é essa parte do padrão (C99):

 

5.1.2.2.3 Program termination
1 If the return type of the main function is a type compatible with int, a return from the initial call to the main function is equivalent to calling the exit function with the value returned by the main function as its argument.

O que indicaria um término anormal do programa é a função abort:

 

7.20.4.1 The abort function
Synopsis
1 #include <stdlib.h>
void abort(void);
Description
2 The abort function causes abnormal program termination to occur, unless the signal SIGABRT is being caught and the signal handler does not return. Whether open streams with unwritten buffered data are flushed, open streams are closed, or temporary files are removed is implementation-defined. An implementation-defined form of the status unsuccessful termination is returned to the host environment by means of the function call raise(SIGABRT).
A utilização de um código numérico diferente de zero é uma convenção utilizada, do tipo "no news is good news": http://programmers.stackexchange.com/questions/153926/non-zero-exit-status-for-clean-exit

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

 

Oi _Isis_ muito obrigado pelo lembrete sobre o o return e exit, realmente eu ate tinha a informação anotada aqui, mas tem hora que os detalhes escapam da gente, muito obrigado mesmo . . .

 

Sobre o abort() essa é nova para mim, mas tenho certeza que vai vir a ser muito util para a continuidade de meus estudos, obrigado . . .

 

+1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, sim. P/ mim o abort é meio estranho porque nos trabalhos da faculdade só usei o raise (sinais e IPC). Veja que não há argumento passado p/ ele e nem retorna nada. Ou seja: como fazer então p/ que o terminal ou outro programa que dependa da execução com sucesso do primeiro saiba que algo deu errado se não há valor de retorno?

 

Na dúvida, continuo usando o return com a convenção (já que lá no texto diz que mais de uma chamada ao exit gera comportamento indefinido, sem especificar se é em sequência ou em partes diferentes do programa):

 

0 => td OK
!= 0 => algo deu errado
Provavelmente uma "saída" seria utilizar o raise e registrar um handler p/ cada sinal, que irá imprimir a mensagem de erro e executar o abort:
(Não testei isso aqui embaixo)
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
 
void show_error_and_exit(int signal) {
   if (errno) {
      printf("%s\n", strerror(errno));
   } else {
      printf("Algum outro erro ocorreu.\n");
  }
  abort();
}
 
signal(SIGABRT, show_error_and_exit);
 
 
(...)
// abertura de arquivo deu erro ou malloc retornou NULL
if (p == NULL)
 raise(SIGABRT);
(....)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.