Pesquisa em Arquivo

1. Pesquisa em Arquivo

Ana Karolina Pereira Kaufmann
Ana888

(usa Outra)

Enviado em 14/12/2016 - 20:28h

Olá, sou estudante de informática e estou tendo problemas com um código em c, se alguém puder verificar e me auxiliar na resolução do problema ficarei extremamente grata, obrigada desde já!
Obs: Testei só com a primeira letra do alfabeto para ver se iria funcionar.
Código:

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

/* Faça um programa que receba do usuario um arquivo texto e mostre na tela quantas
vezes cada letra do alfabeto aparece dentro do arquivo. */

int main() {

char url = "arq.txt";
FILE *arq;
char ch;
int a=0;
arq = fopen ("arq.txt", "r");

if(arq == NULL)
{
printf("Erro, nao foi possivel abrir o arquivo\n");
}

else while((ch = fgetc(arq)) != EOF)
if ( strcmp (ch, 'a') == 0)
{
a++;
printf ("\nA letra <a> foi encontrada %d vezes no arquivo.", a);
}
else
printf ("\nCaracter nao encontrado.");

fclose(arq);
return 0;
}



  


2. Re: Pesquisa em Arquivo

Paulo
paulo1205

(usa Ubuntu)

Enviado em 15/12/2016 - 10:44h

Ana888 escreveu:

Olá, sou estudante de informática e estou tendo problemas com um código em c, se alguém puder verificar e me auxiliar na resolução do problema ficarei extremamente grata, obrigada desde já!
Obs: Testei só com a primeira letra do alfabeto para ver se iria funcionar.
Código:

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

/* Faça um programa que receba do usuario um arquivo texto e mostre na tela quantas
vezes cada letra do alfabeto aparece dentro do arquivo. */

int main() {


Um programa em C tem duas opções para declarar main:

    - recebendo nenhum parâmetro, implicando que a declaração deve ser na forma “int main(void)”; ou

    - recebendo dois parâmetros (através dos quais o ambiente de execução pode passar argumentos ao programa no momento de sua invocação), caso esse em que a declaração deve ter a forma “int main(int argc, char **argv)”, onde argc é um contador da quantidade elementos contidos no segundo argumento, argv, que, por sua vez, é um vetor de strings, cujos elementos representam os sucessivos argumentos passados ao programa.

Do jeito como você fez, você disse ao compilador C que a função main() pode receber uma quantidade indefinida de argumentos de quaisquer tipos, só que isso é errado porque: (i) viola as convenções padronizadas, descritas acima, e (ii) você não faz nenhum uso desses inúmeros possíveis argumentos, logo não quer usar tal declaração (você quer a primeira forma mostrada acima).

	
char url = "arq.txt";
FILE *arq;
char ch;


Você vai usar ch mais abaixo para receber dados de fgetc(). Apesar do nome, o tipo de retorno de fgetc() é int, a fim de poder sinalizar erros de execução com um valor inteiro diferente de qualquer caráter válido. Assim sendo, você tem de declarar essa variável também como int.

(Tecnicamente falando, em caso de erro fgetc() retorna EOF, que tem o valor inteiro -1, ao passo que qualquer leitura bem-sucedida retorna um valor não negativo, tipicamente na faixa de 0 a 255, assumindo que dados do tipo char têm oito bits. Se você atribuir EOF a uma variável do tipo char, fica impossível distinguir entre os valores inteiros -1 e 255).

		int a=0;
arq = fopen ("arq.txt", "r");

if(arq == NULL)
{
printf("Erro, nao foi possivel abrir o arquivo\n");
}

else while((ch = fgetc(arq)) != EOF)
if ( strcmp (ch, 'a') == 0)


A função strcmp() é, como indica o nome, para comparar strings. Você está comparando apenas um caráter, logo pode usar simplesmente o operador == (ou !=).

			{	
a++;
printf ("\nA letra <a> foi encontrada %d vezes no arquivo.", a);
}
else
printf ("\nCaracter nao encontrado.");

fclose(arq);
return 0;
}


Corrigindo os problemas acima, o programa deve funcionar. No entanto, acho que você vai querer fazer de uma forma sucinta, e também tratar alguns casos especiais. Pergunto-lhe:

    - Letras maiúsculas e minúsculas têm de ser tratadas de modo consistente? (Por exemplo: "A casa" deve considerar 3 ocorrências da letra “A”, ou uma de “A” e duas de “a”?)

    - Letras acentuadas ou com diacríticos têm de ser tratadas de forma especial, ou se considera apenas a letra básica, sem seu modificado? (Por exemplo: “Café e açúcar” considera duas ocorrências de “C“ e de “E”, ou uma de “C”, de “Ç“, de “E” e de “É”.

    - Se você aceitar letras acentuadas, qual será o conjunto de caracteres do seu arquivo?

    - Dependendo das informações acima, pode ser bem mais fácil detectar cada letra válida. Você poderia transformar um blocão de ifs ou vários rótulos case numa expressão simples, e usar o valor dessa expressão como índice de um array de letras (por exemplo, 'A' -> 0, 'B' -> 1, 'C' -> 2 etc.), usando os elementos desse array como contadores de cada letra. Algo parecido com o pseudo-código abaixo.

unsigned cont_letra[26]={0};  // Garante que todos os elementos começarão com valor zerado.
int letra, indice;

while(letra=le_letra()){
indice=calcula_indice(letra);
cont_letra[indice]++;
}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts