Ir ao conteúdo

arquivos em c leitura


maxis

Posts recomendados

Postado

galera, estou tentando criar um programa que lê um arquivo em c, e conta quantas vogais existem em todo o arquivo, porém, eu não consigo realizar a abertura dele, onde está o erro? seria na declaração ?:confused:


#include <stdio.h>

int main(void){
FILE *f;
int c, c1,c2,c3,c4,c5,letraa,letrae,letrai,letrao,letrau;
f = fopen("C:/Documents and Settings/joao/Meus documentos/Downloads","r");

if (f == NULL){
printf("Socorro! O arquivo nao pode ser aberto!\n");
system("PAUSE");
return (0);
}

c1=c2=c3=c4=c5 = 0;
letraa=letrae=letrai=letrao=letrau= 0;
while(!feof(f)){
c = fgetc(f);
c = toupper(c);
printf("%c %c\n",c1,c);
if(c1 == 'A' && !(c >= 'A' && c <= 'Z')){
letraa++;
c1 = c;
}
if(c2 == 'E' && !(c >= 'E' && c <= 'Z')){
letrae++;
c2 = c;
}
if(c3 == 'I' && !(c >= 'I' && c <= 'Z')){
letrai++;
c3 = c;
}
if(c4 == 'O' && !(c >= 'O' && c <= 'Z')){
letrao++;
c4 = c;
}
if(c5 == 'U' && !(c >= 'U' && c <= 'Z')){
letrau++;
c5 = c;
}
}
printf("npalavras = %d\n",letraa);
printf("npalavras = %d\n",letrai);
printf("npalavras = %d\n",letrae);
printf("npalavras = %d\n",letrao);
printf("npalavras = %d\n",letrau);


system("PAUSE");
return (0);
}

Postado

* Não me lembro de C atualmente aceitar essa sintaxe: "c1=c2=c3= ..."

* No caso seu arquivo a ser aberto se chama "Downloads" porque é a última informação no caminho do fopen. Está correto?

* Falta usar fclose ao terminar a leitura.

* Se o programa quer saber só de vogal, não precisaria dessa parte no "if": (! ... 'A' ... 'Z') Se for igual a 'A', ele conta +1 e parte prá ler o próximo caractere (comando continue; ). Senão ele tenta com 'E' etc ... ;

No caso, dava prá usar um switch na avaliação das vogais:


switch(var) {

case 'a':
case 'A: letra_a++; break;
case 'e':
case 'E': letra_e++; break;
...
default: ...

}

ou vetores:



FILE etc ...
fopen etc...

char maiusculas[5] = {'A','E','I','O','U'};
int contador[5] = {0, 0, 0, 0, 0};

// falta declarar minusculas

while (feof(etc ... )) {

for (i=0;i<5;i++) {

if (caracter_lido == maiusculas[i]) // fazer o mesmo com minusculas
{
contador[i]++;
break;
}

}

}

Isso foi um rascunho.

Postado

fiz algumas modificações, porém ainda não é reconhecido o arquivo, porém a parte de baixo está correta?:confused:


#include <stdio.h>

int main(void){
FILE *f;
int c, i;
f = fopen("C:/Documents and Settings/joao/Meus documentos/Downloads","r");
char letras[5]={'A','E','I','O','U'};
int cont[5]={0,0,0,0,0};

if (f == NULL){
printf("Socorro! O arquivo nao pode ser aberto!\n");
system("PAUSE");
return (0);
}

while(!feof(f)){
for (i=0;i<5;i++) {
c = fgetc(f);
c = toupper(c);
printf("%c %c\n",letras[i],c);
if(letras[0] == 'A' && !(c >= 'A' && c <= 'Z')){
cont[0]++;
letras[0] = c;
}
if(letras[1] == 'E' && !(c >= 'E' && c <= 'Z')){
cont[1]++;
letras[1] = c;
}
if(letras[2] == 'I' && !(c >= 'I' && c <= 'Z')){
cont[2]++;
letras[2] = c;
}
if(letras[3] == 'O' && !(c >= 'O' && c <= 'Z')){
cont[3]++;
letras[3] = c;
}
if(letras[4] == 'U' && !(c >= 'U' && c <= 'Z')){
cont[4]++;
letras[4] = c;
}
}
}
printf("npalavras = %d\n",cont[0]);
printf("npalavras = %d\n",cont[1]);
printf("npalavras = %d\n",cont[2]);
printf("npalavras = %d\n",cont[3]);
printf("npalavras = %d\n",cont[4]);
fclose(f);

system("PAUSE");
return (0);
}

Postado

f = fopen("C:/Documents and Settings/joao/Meus documentos/Downloads","r")

O nome de seu arquivo é "Downloads"?

No exemplo que passei, o array char letras[5]={'A','E','I','O','U'} serve prá não ter que se escrever todas as comparações.

Explicando:

 char letras[5]={'A','E','I','O','U'}; 
// As vogais foram guardadas nesse vetor. Ele será usado prá comparação

int cont[5]={0,0,0,0,0};
// isto aqui servirá para armazenar as contagens de cada vogal

while(!feof(f)){
// isto aqui serve prá verificar se o arquivo chegou ao fim, que foi todo lido, certo?

c = fgetc(f);
// isto aqui lê apenas um único caracter por vez do arquivo

c = toupper(c);
// e isto aqui converte o caracter prá maiúscula.
// Se não for letra, ele deixa o caracter como está.
// A vantagem é a de não precisar fazer comparações com vogais minúsculas

for (i=0;i<5;i++){
// você possui 5 vogais para comparar.
// Então esse "for" faz repetição de 5 vezes

if (c==letras[i]) {
// a variável "i" do "for" é contada de 0 até 4.
// Quais são os valores de letras[i]
// quando esse "i" vai de 0 a 4? 'A', 'E' ...
// são as vogais!

// Para letras[0], que é igual a 'A', então ficaria como se fosse if(c=='A') cont[0]++;
// Para letras[1], que é igual a 'E', então ficaria como se fosse if(c=='B') cont[0]++;

cont[i]++;
// se o caracter lido do arquivo, que é aquela variável "c",
// que foi usada com o toupper() for igual a um dos valores de "letras[i]",
// que é uma vogal armazenada, a variável "cont[i]" sera aumentada em 1.

break;

// Esse "break" que aparece dentro do if() é prá parar a contagem do for().
// Se ele já fez if(c=='A') e foi verdadeiro, ele não precisa fazer if(c=='E')
// porque não tem como esse "c" ser igual a 'E', 'I', 'O', 'U'
// até que o fgets() leia outro caracter.
// Aliás, ele já vai direto ler o próximo caracter se o arquivo não acabou.
// Ele fica mais rápido.

}

}

fclose(f); // fecha o arquivo

// daí no final pode ficar assim:

for (i=0;i<5;i++){
printf ("Existem %d vogais iguais à letra %c no arquivo.\n", cont[i], letras[i]);

// Esse for é executado contando em "i" valores de 0 a 4
// No lugar de %c aparece uma daquelas vogais guardadas em letras[];
// Em %d aparece a quantidade dessa vogal. Para letras[0], que é igual a 'A', aparece o valor de cont[0], que foi quem armazenou a contagem de letras 'A'.

}

Novamente eu fiz como esboço.

Postado

valeu, agora ele está contando todas, porém eu estou tendando fazer ele fazer a contagem do percentual de cada letra, e quando achar, fazer uma normatização, onde devo normalizar os meus percentuais de modo a fazer com que o caractere com maior ocorrência possua percentual

igual a 100%.TENTEI FAZER A NORMALIZAÇÃO MAIS ELE COLOCA VARIOS IGUAL A 100%,ONDE ESTÁ O ERRO?


#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main(void){
FILE *f;
int c, i;
float x[5],soma=0;
f = fopen("C:/Documents and Settings/Max/Meus documentos/eu.txt","r");
char letras[5]={'A','E','I','O','U'};
int cont[5]={0,0,0,0,0};

if (f == NULL){
printf("Socorro! O arquivo não pode ser aberto!\n");
system("PAUSE");
return (0);
}

while(!feof(f)){

c = fgetc(f);
c = toupper(c);
for (i=0;i<5;i++) {
printf("%c %c\n",letras[i],c);
if (c==letras[i]) {
cont[i]++;
break;
}
}
}
fclose(f);
for (i=0;i<5;i++){
printf ("Existem %d vogais iguais à letra %c no arquivo.\n", cont[i], letras[i]);
}
for(i=0;i<5;i++){
soma=cont[i]+soma;
}
for(i=0;i<5;i++){
x[i]= (cont[i]*100)/soma;
printf("porcentagem de:%.1f na letra %c\n",x[i],letras[i]);
}
for(i=0;i<5;i++){
if(x[i]>x[i+1]){
x[i]=100;
}else{
x[i+1]=100;
}
printf("\n\n\n%.1f",x[i]);
}


system("PAUSE");
return (0);
}

Postado

O processo é o mesmo que você fez para a primeira porcentagem, alterando apenas a base.


#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

int main(void)
{
FILE *f = NULL;
int c = 0;
int i = 0;
int soma = 0;
int maior = 0;
float porcentagemTotal[5] = {0};
float porcentagemRelativa[5] = {0};
char letras[5] = {'A','E','I','O','U'};
int cont[5] = {0};

f = fopen("C:/Documents and Settings/Max/Meus documentos/eu.txt","r");

if( f == NULL )
{
perror("Socorro! O arquivo não pode ser aberto! Motivo"); // Usando perror(), mostra o motivo do erro
return(0);
}

while( !feof(f) )
{
c = fgetc(f);
c = toupper(c);

for( i = 0; i < 5; i++ )
{
if( c == letras[i] )
{
cont[i]++;
break;
}
}
}

fclose(f);

for( i = 0; i < 5; i++ )
printf ("Existem %d vogais iguais à letra %c no arquivo.\n", cont[i], letras[i]);

for( i = 0; i < 5; i++ )
soma += cont[i];

for( i = 0; i < 5; i++ )
{
porcentagemTotal[i] = ( cont[i] * 100 ) / soma;
printf("(Base %d) porcentagem de: %.1f na letra %c\n", soma, porcentagemTotal[i], letras[i]);
}

maior = cont[0]; // Inicia a comparação
for( i = 1; i < 5; i++ )
if( cont[i] > maior )
maior = cont[i];

for( i = 0; i < 5; i++ )
{
porcentagemRelativa[i] = ( cont[i] * 100) / maior;
printf("(Base %d) porcentagem de: %.1f na letra %c\n", maior, porcentagemRelativa[i], letras[i]);
}

return (0);
}

Postado

O que seria necessário eu fazer para gerar o gráfico desse programa?:o

#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

int main(void)
{
FILE *f = NULL;
int c = 0;
int i = 0;
int soma = 0;
int maior = 0;
int histograma[101][260]
float porcentagemTotal[5] = {0};
float porcentagemRelativa[5] = {0};
char letras[5] = {'A','E','I','O','U'};
int cont[5] = {0};

f = fopen("C:/Documents and Settings/Max/Meus documentos/eu.txt","r");

if( f == NULL )
{
perror("Socorro! O arquivo não pode ser aberto! Motivo"); // Usando perror(), mostra o motivo do erro
return(0);
}

while( !feof(f) )
{
c = fgetc(f);
c = toupper(c);

for( i = 0; i < 5; i++ )
{
if( c == letras[i] )
{
cont[i]++;
break;
}
}
}

fclose(f);

for( i = 0; i < 5; i++ )
printf ("Existem %d vogais iguais à letra %c no arquivo.\n", cont[i], letras[i]);

for( i = 0; i < 5; i++ )
soma += cont[i];
printf("\n----------procentagens-------------------------------------\n");
for( i = 0; i < 5; i++ )
{
porcentagemTotal[i] = ( cont[i] * 100 ) / soma;
printf("(Base %d) porcentagem de: %.1f na letra %c\n", soma, porcentagemTotal[i], letras[i]);
}
printf("\n\n\n");
printf("---------------------normalização-------------------------\n");
maior = cont[0]; // Inicia a comparação
for( i = 1; i < 5; i++ )
if( cont[i] > maior )
maior = cont[i];

for( i = 0; i < 5; i++ )
{
porcentagemRelativa[i] = ( cont[i] * 100) / maior;
printf("(Base %d) porcentagem de: %.1f na letra %c\n", maior, porcentagemRelativa[i], letras[i]);
}


system("PAUSE");
return (0);
}

Postado

Função que monta a porcentagem em modo texto:


void porcentagem(int valor)
{
char vetor[53] = {'\0'};
int i = 0;

vetor[0] = '[';
vetor[51] = ']';
vetor[52] = '\0';

for( i = 1; i <= valor / 2; i++ )
vetor[i] = '=';

for(; i <= 50; i++ )
vetor[i] = ' ';

printf("%s", vetor);
return;
}

Chamada da função:


printf("Porcentagem Total:\n");
for( i = 0; i < 5; i++ )
{
printf("%c - %4.1f%% - ", letras[i], porcentagemTotal[i] );
porcentagem(porcentagemTotal[i]);
printf("\n");
}

Postado

Aparecem três tipos de porcentagem em seu código:

* a de cada vogal no total de vogais;

* a de cada vogal no total de letras do texto;

* a do total de vogais no total de letras do texto.

total_vogais = cont[0]+cont[1]+ ...

porcentagem de letras 'A' no total de vogais = (cont[0]/total_vogais) * 100;

o mesmo com as outras.

prá saber a quantidade de letras/caracteres no texto teriam que ser contados desde o começo. vamos lá, foi contado e está na variável total_texto. fica:

porcentagem de letras 'A' no total do texto = (cont[0]/total_texto) * 100;

o mesmo com as outras.

e o último caso fica:

porcentagem de vogais em todo o texto = (total_vogais/total_texto) * 100

os valores numéricos dessas porcentagens não são quantidades inteiras como as contagens de letras. não se usa "int", mas sim "float"

não se esqueça de criar um vetor para as porcentagens, assim como foi feito com as vogais e com as contagens de vogais.

há uma sutileza de código: 100 é inteiro e 100.0 é float. quando o programa encontra um cálculo de float com inteiro, ele força a conversão para inteiro e então adeus casas decimais.

2.5 * 2.5 = 6.25. mas e se ele fizesse 2 * 2 = 4 por ignorar os decimais?

em algumas situações é necessário forçar-se a conversão inversa de int para float com o uso da expressão-chave "(float)" (é com parênteses mesmo) no código e antes da variável inteira.

e o gráfico está ok. basta verificar se é necessário fazer uma escala por limitações da tela.

Postado

Como eu posso fazer para gerar a imagem desse gráfico, tentei fazer isso, porém acho q tá errado, e qual a numeração da cor preta?

#include <stdlib.h>

#include <stdio.h>

#include <ctype.h>

void porcentagem(int valor)

{

char vetor[53] = {'\0'};

int i = 0;

vetor[0] = '[';

vetor[51] = ']';

vetor[52] = '\0';

for( i = 1; i <= valor / 2; i++ )

vetor = '=';

for(; i <= 50; i++ )

vetor = ' ';

printf("%s", vetor);

return;

}

int main(void)

{

FILE *f = NULL;

FILE *fgraf=NULL;

int c = 0;

int i = 0;

int soma = 0,largura=100,altura=259,j,r,g,b;

int maior = 0;

int histograma[101][260];

float porcentagemTotal[24] = {0};

float porcentagemRelativa[24] = {0};

char letras[24] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','X','Z'};

int cont[24] = {0};

f = fopen("C:/Documents and Settings/Max/Meus documentos/eu.txt","r");

if( f == NULL )

{

perror("Socorro! O arquivo não pode ser aberto! Motivo");

return(0);

}

fgraf=fopen("C:/Documents and Settings/Max/Meus documentos/ppms/grafico.ppm","w");

fprintf(fgraf,"P3\n#leitura da imagem\n");

while( !feof(f) )

{

c = fgetc(f);

c = toupper©;

for( i = 0; i < 24; i++ )

{

if( c == letras )

{

cont++;

break;

}

}

}

fclose(f);

for( i = 0; i < 24; i++ )

printf ("Existem %d letras iguais à letra %c no arquivo.\n", cont, letras);

for( i = 0; i < 24; i++ )

soma += cont;

printf("\n----------procentagens-------------------------------------\n");

for( i = 0; i < 24; i++ )

{

porcentagemTotal = ( cont * 100 ) / soma;

printf("(Base %d) porcentagem de: %.1f na letra %c\n", soma, porcentagemTotal, letras);

}

printf("\n\n\n");

printf("---------------------normalização-------------------------\n");

maior = cont[0];

for( i = 1; i < 24; i++ )

if( cont > maior )

maior = cont;

for( i = 0; i < 24; i++ )

{

porcentagemRelativa = ( cont * 100) / maior;

printf("(Base %d) porcentagem de: %.1f na letra %c\n", maior, porcentagemRelativa, letras);

}

printf("\n------------------grafico-------------------------\n");

printf("Porcentagem Total:\n");

for( i = 0; i < 24; i++ )

{

if(porcentagemTotal>0){

printf("%c - %4.1f%% - ", letras, porcentagemTotal );

porcentagem(porcentagemTotal);

printf("\n");

}

}

printf("\n------criar imagem do grafico--------------\n");

for(i=0;i<largura;i++){

for(j=0;j<altura ;j++){

histograma[j]= porcentagemTotal;

fprintf(fgraf,"%d %d %d\n",255-r,255-g,255-b );

}

}

fclose(fgraf);

system("PAUSE");

return (0);

}

Arquivado

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

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...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!