Ir ao conteúdo

Posts recomendados

Postado

(Peço ajuda(ideia) para desenvolver o seguinte exercicio na linguagem C.)

 

Escreva um programa que armazene em um arquivo o RGA, Nome e Nota de 5 alunos e, apos a escrita, escreva o RGA, Nome e Nota dos alunos que possuem Nota acima de 7.

 *Escreva o programa utilizando arquivo binario.

 *Faça uma segunda solução utilizando arquivo texto.

  • Administrador
Postado

Caro usuário,

 

Seja bem-vindo ao Clube do Hardware.

 

No intuito de servir como fonte de pesquisa no caso de instituições de ensino, informamos que incorrer no resolvimento por completo de questões relacionadas a disciplinas escolares de cursos técnicos e faculdades podem ser revistas e removidas pela Equipe de Moderação do Clube do Hardware.

 

Para sanar dúvidas sobre esse tipo de problema, por gentileza, publique o passo a passo do desenvolvimento da questão, projeto, monografia ou conteúdo em dúvida para que possamos analisar se a resposta está correta ou não, ou para que possa ser auxiliado com a dúvida no desenvolvimento do exercício.

 

Infelizmente, não há como resolver os trabalhos pelos usuários. O objetivo do Clube do Hardware é auxiliar seus usuários a encontrar soluções para que possam sanar suas dúvidas, e não de trazer soluções prontas para seus usuários. Além disso, copiar e colar respostas que não são de autoria própria do qualquer usuário é considerado plágio, o que é ilegal.

 

Esperamos que compreenda.

 

Atenciosamente,

Equipe Clube do Hardware

Postado

O que você vai precisar saber: "structs" e manipulação de arquivos (leitura e escrita). Qualquer dúvida relacionada aos tópicos que te indiquei, poste aqui e eu vou te ajudando nas suas dúvidas.

Postado

 

13 horas atrás, paulo luz magalhaes disse:

*Escreva o programa utilizando arquivo binario.

 *Faça uma segunda solução utilizando arquivo texto.

 

A diferença entres dois é de uma letra no modo de abertura do arquivo. 

 

Dentro de um arquivo tem muitas vezes a noção de registro. Nesse caso

  • um arquivo texto é visto em geral como uma série de "registros", as linhas, que são separadas por um '\n' o tal newline e que muitas vezes são duas letras :) o tal line feed, 10, e o return 13, naquela tal tabela ASCII. E tais linhas tem comprimento variável, se imaginando o comprimento como a distância até o próximo newline.
  • um arquivo "binário" não tem essa distinção e muitas vezes o registro é visto como um simples byte. Outras vezes como uma coisa mais complexa, como um arquivo jpg por exemplo. Em muitas linguagem, como COBOL e Pascal, um arquivo é definido como sendo de fato uma série de registros. E em C se pode ver um arquivo como um vetor de coisas de tamanho fixo --- como char por exemplo --- ou como o que o enunciado sugere aqui: 
     
    13 horas atrás, paulo luz magalhaes disse:

    RGA, Nome e Nota de 5 alunos


    criando um registro, como em COBOL ou Pascal e dando um nome a ele: 
     

    typedef struct
    {
        char    RA[8];
        char    nome[40];
        char    nota[3];
    
    }   Registro;

 

 

E criar um arquivo de Registro. Gravar usando write(0 e ler usando read(). 

 

Um arquivo é só um arquivo. Ele não sabe se é binário ou de texto ou se foi gravado em C ou FORTRAN.

 

Claro que se pode usar read(0 e write() apenas para tratar qualquer arquivo. Se usa fprintf() e fscanf() para texto por exemplo porque são funções mais adaptadas a usar texto e formatar as coisas.

  • Curtir 1
Postado
9 horas atrás, Kyul disse:

O que você vai precisar saber: "structs" e manipulação de arquivos (leitura e escrita). Qualquer dúvida relacionada aos tópicos que te indiquei, poste aqui e eu vou te ajudando nas suas dúvidas.

a ideia do programa ficou desse jeito, mas ainda esta com problemas, nao estou tendo sucesso.

#include <stdio.h>
#include <string.h>
#define TAM 5 //tamanho do vetor usado como cadastro
void imprimeArquivo(){
Aluno cadastro[5];
FILE *arq = fopen(nomeArq, "r+b"); //Note que usamos r e n~ao w
int i;
if(arq == NULL){
printf("Erro: Imprime Arquivo!\n");
return;
}
fread(cadastro, sizeof(Aluno), TAM, arq);
printf(" ---- Imprimindo Dados ----\n");
for(i=0; i<TAM; i++){
printf("nome: %s, rga: %s, nota:f \n", cadastro[i].nome, cadastro[i].rga, cadastro[i].nota);
}
printf("\n");
fclose(arq);
}

 

Postado
12 minutos atrás, paulo luz magalhaes disse:

a ideia do programa ficou desse jeito, mas ainda esta com problemas, nao estou tendo sucesso

 

Não entendi sua ideia. Está tentando ler o que não escreveu ainda?

 

  • O que seria esse modo "r+b"?
  • está tentando abrir um arquivo que se chamaria "nomeArq" e o que seria isso?
  • declarou cadastro como Aluno[5]. OK. Mas que seria Aluno?
  • faça o simples se quer ler antes. Use algo assim, como in.txt por exemplo
     
    012345678901234567890123456789RGARGARGA100
    Jhon Doe I                    1234501-6091
    Jhon Doe II                   1234502-6092
    Jhon Doe III                  1234503-6093
    Jhon Doe IV                   1234504-6094


    Copie isso para o disco e tente ler o nome com 30 bytes, o RA com 9 e  nota com 3. Seria algo como um arquivo binário mas não faz diferença: o que importa é que o tamanho está fixo...

Seu problema é a princípio de armazenar os dados e depois ler os caras de volta e mostrar os que tenham nota maior que 7 usando arquivos "binários" ou "texto". E o enunciado é fraco e vago.

evite void. Em especial evite

    void f(void); 

uma função que retorna void --- nada --- e não tem argumentos é um buraco negro. Vai depeder de valores externos, globais, e não é esperto. Flexibilidade por exemplo é zero.

Compare
 

    void imprimeArquivo();

 

Com
 

    int imprimeArquivo(const char* nome_do_arquivo);

 

E imagine se prefere uma função que retorna por exemplo o total de linhas que imprimiu, e aceita o nome do arquivo como parâmetro, e onde você pode escrever

 

    int linhas = imprimeArquivo( "alunos.txt" );

 

Postado
18 horas atrás, paulo luz magalhaes disse:

a ideia do programa ficou desse jeito, mas ainda esta com problemas, nao estou tendo sucesso.



#include <stdio.h>
#include <string.h>
#define TAM 5 //tamanho do vetor usado como cadastro
void imprimeArquivo(){
Aluno cadastro[5];
FILE *arq = fopen(nomeArq, "r+b"); //Note que usamos r e n~ao w
int i;
if(arq == NULL){
printf("Erro: Imprime Arquivo!\n");
return;
}
fread(cadastro, sizeof(Aluno), TAM, arq);
printf(" ---- Imprimindo Dados ----\n");
for(i=0; i<TAM; i++){
printf("nome: %s, rga: %s, nota:f \n", cadastro[i].nome, cadastro[i].rga, cadastro[i].nota);
}
printf("\n");
fclose(arq);
}

 

Que tipo de problemas você está tendo, exatamente?
Concordo em partes o que o colega acima disse. Mas vamos lá.
Volto a repetir aqui que seria uma boa você dar uma olhada em uma documentação de quem implementa a linguagem C, para conhecer como se manipula um arquivo.
Não sei se você sabe algo de inglês, mas uma possível documentação que você poderia ler seria essa: https://www.gnu.org/software/libc/manual/html_node/I_002fO-on-Streams.html

Embora seja uma documentação para o compilador GNU para a linguagem C, essas informações se aplicam no seu caso também, pois, provavelmente, você está rodando em ambiente Windows com MingW, ou algo parecido.

Então, como não sei qual o problema que você tá tendo, vou apontar um aviso aqui: a flag "r+b", permite que você leia ou escreva no arquivo, mas ela não cria o arquivo em si, o arquivo deve existir para funcionar como esperado.
Outro aviso que deixo aqui é que para manipular arquivos binários: quando for escrever, OBRIGATORIAMENTE, você deve utilizar a flag "wb", ou alguma variante do tipo. Mas para ler, você não é obrigado a utilizar o "b" nas flags. Isso porque você está lendo bytes (0's e 1's), e salvando-os na memória exatamente como você os pegou. Então, tanto faz se você utiliza o "b" ou o não.

Uma outra dica: "structs", geralmente, tendem a consumir mais memória do que o esperado. Por exemplo:

Qual seria o tamanho (sizeof) da struct abaixo?

struct t_test
{
	char c;
	int d;
};

Se você respondeu 5, errou. Isso varia de arquitetura para arquitetura, mas, geralmente, na arquitetura i386 (ou x86_64, ou ainda, mais conhecida como x86), "int" tem tamanhos de 4 bytes e "char" de 1 byte, MAS... Para melhorar o acesso a memória o compilador insere gaps ("buracos") entre as variáveis da "struct" para que o processador necessite fazer menos acessos à memória para acessar o dado. As variáveis "int" devem ficar em endereços múltiplos de 4 (por conta dos 4 bytes). Não vou me estender nesse assunto por aqui, esse não é o foco, mas se quiser saber mais, procure sobre alinhamento de memória.

Eu disse isso tudo, porque você pode estar ocupando mais espaço no seu arquivo do que precisa. Na "struct" que eu dei como exemplo, ao invés de cada dado guardado no arquivo ocupar 5 bytes, vão ocupar 8 bytes.

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!