Baixe o app para aproveitar ainda mais
Prévia do material em texto
Prezado aluno. Caso não tenha participado do fórum C, a participação neste se torna obrigatória para que possa pontuar para a AV2. Mas se já participou do C e desejar pode participar deste também. A pontuação máxima para participação nos dois últimos fóruns será de 2,0 pontos. Não temos um número mínimo e máximo de postagens para atribuição de pontos, mas sim o quanto as mesmas contribuem para a discussão dos assuntos em destaque, porém, dificilmente uma única postagem será o suficiente para que receba a pontuação máxima (2,0). A participação nestes fóruns deverá acontecer ao longo do período (calendário), onde o aluno deverá apresentar suas ideias, opiniões e discutir os assuntos apresentados nas aulas, minha dica é que observem o segundo slide de cada aula, onde são apresentados os tópicos propostos para a mesma e tome cada um deles como um tema para se discutir. Estarei acompanhando e caso necessário incluindo novas considerações e provocações. Postagens como: ok, valeu, concordo com o colega tal, bem como cópia de conteúdo da internet e assuntos que não dizem respeito ao conteúdo das aulas em discussão serão desconsiderados e não pontuam. O aluno deverá levar em conta as minhas postagens e as dos colegas antes de fazer as suas postagens, evitando postagens repetidas. Vamos fazer do fórum, um bom material de consulta de conteúdo. Não teremos aqui um conjunto de perguntas e respostas para serem apresentadas, mas sim um “diálogo”, por isso não deixe de entrar sempre no ambiente e ler o que tem sido colocado e sempre que for pertinente deixar sua participação. Vamos lá, caprichem! Boa noite Professor (a), Participei do fórum C, porém resolvi participar desse fórum também para melhorar minha compreensão da matéria. Na aula 09, é falado que para saber se é um arquivo texto ou um arquivo binário deve-se observar o modo de abertura que está presente na função que abre o arquivo externo. Gostaria de compreender melhor, pois essa explicação do slide não ficou bem clara. Desde já, agradeço. Boa noite Professor (a), fread() e fscanf() são dois tipos de funções que podem ler um arquivo, então eu posso usar qualquer um sem distinção ou fiz confusão. Desde já, agradeço. Olá Renan, Veja este link, é bem completo, sobre arquivos. Após estudar este conteúdo e pesquisar mais poste aqui qualquer dúvida que não conseguir esclarecer. http://homepages.dcc.ufmg.br/~joaoreis/Site de tutoriais/c_int/arquivos.htm Olá Renan, Cada função tem suas próprias características, cabendo ao programador decidir quando utilizar cada uma. Faça uma pesquisa e poste sobre cada uma dessas funções, exemplificando. Boa noite professor, Gostei muito do link que o Sr. me mandou, tem um excelente conteúdo, porém só fala no inicio sobre arquivo de texto e binário e não tem exemplos, o que dificulta a compreensão. Consegui achar um link que fala mais sobre o assunto e engloba exemplos. Copiei o link e enviei abaixo para que os meus amigos leiam um pouco mais sobre esse assunto, o conteúdo não é extenso. http://www.cin.ufpe.br/~mcps/IF165/Lista%20de%20Comandos%20Pascal%20(Arquivos).pdf Fread Essa função envolve os conceitos de ponteiro e vetor. Podemos escrever e ler blocos de dados. Para tanto, temos as funções fread() e fwrite(). O protótipo de fread() é: unsigned fread (void *buffer, int numero_de_bytes, int count, FILE *fp); O buffer é a região de memória na qual serão armazenados os dados lidos. O número de bytes é o tamanho da unidade a ser lida. count indica quantas unidades devem ser lidas. Isto significa que o número total de bytes lidos é: numero_de_bytes*count A função retorna o número de unidades efetivamente lidas. Este número pode ser menor que count quando o fim do arquivo for encontrado ou ocorrer algum erro. Quando o arquivo for aberto para dados binários, fread pode ler qualquer tipo de dados. A função fread() se torna muito útil quando precisamos ler grandes blocos ou até mesmo todo o conteúdo de um arquivo. Neste caso, o conteúdo lido é guardado em um buffer para uso posterior. Veja o protótipo desta função: size_t fread(void *ptr, size_t size, size_t count, FILE *stream); Aqui ptr é um ponteiro para o buffer que receberá o conteúdo sendo lido. A capacidade deste buffer deverá ser no mínimo o valor de size multiplicado por count. O parâmetro size é o tamanho em bytes de cada elemento sendo lido. count é o número de elementos a serem lidos e stream é um ponteiro para o arquivo cujo conteúdo será lido. Se a leitura do conteúdo for feita com sucesso, a função fread() retornará a quantidade de elementos lidos com sucesso. No exemplo abaixo estamos lendo caracteres de 1 byte cada. Analise o código cuidadosamente e verá como é fácil modificá-lo para, por exemplo, ler apenas a metade do arquivo de cada vez: #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]){ // vamos abrir o arquivo para leitura no modo binário FILE *arquivo = fopen("dados.txt", "rb"); if(arquivo != NULL){ // vamos obter o tamanho do arquivo em bytes fseek(arquivo, 0, SEEK_END); long tam_arquivo = ftell(arquivo); rewind(arquivo); // vamos alocar memória para todo o conteúdo do arquivo char *buffer = (char*)malloc(sizeof(char) * tam_arquivo); // a memória foi alocada com sucesso? if(buffer != NULL){ // vamos copiar o conteúdo do arquivo para o buffer size_t resultado = fread(buffer, 1, tam_arquivo, arquivo); // vamos verificar se a operação foi feita com sucesso if(resultado == tam_arquivo){ puts("O conteudo do arquivo foi lido com sucesso\n\n"); // vamos exibí-lo na tela puts(buffer); } } fclose(arquivo); // fecha o arquivo free(buffer); // libera a memória do buffer } puts("\n\n"); system("PAUSE"); return 0; } Fscanf Sintaxe quase igual à de scanf(); só é necessário adicionar o identificador de fluxo no início. A função fscanf() funciona como a função scanf(). A diferença é que fscanf() lê de um arquivo e não do teclado do computador. Protótipo: int fscanf (FILE *fp,char *str,...); #include <stdio.h> #include <stdlib.h> int main() { FILE *p; char str[80],c; printf("\n\n Entre com um nome para o arquivo:\n"); /* Le um nome para o arquivo a ser aberto: */ gets(str); if (!(p = fopen(str,"w"))) /* Caso ocorra algum erro na abertura do arquivo..*/ { /* o programa aborta automaticamente */ printf("Erro! Impossivel abrir o arquivo!\n"); exit(1); } fprintf(p,"Este e um arquivo chamado:\n%s\n", str); fclose(p); /* Se nao houve erro, imprime no arquivo, fecha ...*/ p = fopen(str,"r"); /* abre novamente para a leitura */ while (!feof(p)) { fscanf(p,"%c",&c); printf("%c",c); } fclose(p); return 0; } Quando um arquivo é aberto no modo de texto, uma tentativa de ler linhas do texto usando a função Fscanf pode falhar e apenas uma linha de texto é lido do arquivo. O delimitador é definido como "[^ \n]". A função Fscanf lê até, mas não inclua o caractere de delimitação. Portanto, o fluxo de arquivos pára na primeira '\n' no arquivo. Chamadas de função Fscanf subsequentes falham porque o ponteiro de arquivo permanece com o caractere de delimitação e a função Fscanf não é possível avançar o ponteiro de função após ele. Para mover o ponteiro do arquivo após o caractere de delimitação, use um dos dois métodos a seguir: Atualize o código para usar a seguinte chamada de função Fscanf : fscanf(stream, "%[^\n]%*c", line) O "% * c" especificador de formato lê um caractere do fluxo de entrada, mas não o atribui a qualquer um dos parâmetros na chamada da função fscanf. Chame a função Fgetc depois de chamar a função Fscanf para mover o ponteiro de arquivo além do caractere '\n'. O exemplo de códigoa seguir demonstra esse problema. O exemplo de código deve ler e imprimir linhas de um arquivo de texto até que ele atinja o EOF. No entanto, o código de exemplo lê apenas a primeira linha do arquivo. Como o caractere de fim de arquivo não foi encontrado, o exemplo de código é executado em um loop infinito se o fluxo de arquivo contém um caractere "\n". FILE *stream; char line[80]; while ((fscanf(stream, "%[^\n]", line)) != EOF ) { printf("Line = %s \n",line); } O exemplo de código a seguir demonstra o segundo método acima para contornar este problema: FILE *stream; char line[80]; while ((fscanf(stream, "%[^\n]", line)) != EOF) { fgetc(stream); // Reads in '\n' character and moves file // stream past delimiting character printf("Line = %s \n", line); } Olá Renan, O conteúdo que postou está muito bom, porém deveria ter resumido com as suas palavras e postado a fonte de pesquisa para que os colegas pudessem conferir o conteúdo completo. Boa noite professor, Segue resumo com as minhas palavras e os exemplos que o Sr. Pediu. E o link que me ajudou. http://homepages.dcc.ufmg.br/~joaoreis/Site%20de%20tutoriais/c_int/arquivos.htm fread – É utilizada para escrever e ler estruturas de um arquivo para podermos construir registros. Exemplo: /* Usando fread para ler dados de um arquivo */ #include <stdio.h> int main() { FILE *arquivo; char nome[5]; int idade; float altura; if((arquivo = fopen("samu.dat","rb")) == NULL) { printf("Erro ao abrir arquivo!!!\n\n"); exit(1); } fread(&nome,sizeof(nome),1,arquivo); fread(&idade,sizeof(idade),1,arquivo); fread(&altura,sizeof(altura),1,arquivo); printf("nome : %s\n",nome); printf("idade : %d\n",idade); printf("altura: %.2f\n",altura); fclose(arquivo); return(0); } fscanf – É utilizada para ler dados de um arquivo a partir de uma fonte de caracteres especificado. Exemplo: /* exemplo do uso de fscanf e fprintf * este programa lê uma string do teclado e a escreve num arquivo texto * compilado com o nome de adtexto */ #include <stdio.h> int main() { FILE *arquivo; char string[80]; if((arquivo = fopen("adtexto.txt","w")) == NULL) { printf("Erro ao abrir o arquivo!\n"); exit(1); } printf("Exemplo do uso de fscanf e fprintf\n"); printf("Digite uma string\n\n"); fscanf(stdin,"%s",string); /* lê string do teclado */ fprintf(arquivo,"%s",string); /* escreve string no arquivo */ fclose(arquivo); return(0); }
Compartilhar