Você está na página 1de 3

0

Manipular Strings em C é um pouco mais complicado do que na maioria das linguagens.

Para fazer pesquisas em arquivos texto em C você deverá fazer um LOOP lendo todo o
arquivo e checando caracter por caracter para encontrar a STRING que você está
pesquisando.

Exemplo:

FILE *f = fopen("arquivo.txt", "r");


char c;
int i;
char* string_pesquisar = "Revista Epoca";
while((c = fgetc(f)) != EOF){
if(c == *string_pesquisar){ //Primeiro caracter da STRING que estamos buscando
foi encontrado, vamos checas os subsequentes:

for(i = 0; i < strlen(string_pesquisar); i ++){ //loop para comparar cada


caracter da String pesquisada com o proximo caracter lido
c = fgetc(f); //lê mais um caracter no arquivo
if(c == EOF) //se encontrar o final do arquivo sai do loop
break;
if(*(string_pesquisar + i) != c) //se algum caracter subsequente lido
for diferente da string pesquisada sai do loop
break;
}

if(i == strlen(string_pesquisar){ //se i == qtd caracteres da String a


pesquisar então achamos a string (a verificação não foi interrompida durante as
comparações de caracteres)
//Aqui entra o seu código ao achar a STRING que você procurava

break; //break para parar de ler o arquivo


}
}
}

fclose(f);
Existe um HEADER para C com funções para manipulação de string, além do string.h,
você pode encontrá-lo aqui:
https://gist.github.com/raphaelnapi/ed0c29e049ee6dd0d36d687b77b9ee0a

Com esse header no seu projeto você pode utilizar a função instr() para pesquisar
uma string dentro de outra. Ele retornará a posição do primeiro caracter da String
pesquisada ou -1 caso não a encontre.

Exemplo:

instr(0, "Código escrito em C", "escrito");


Essa chamada para função instr() buscará a string "escrito" dentro da string
"Código escrito em C" a partir da posição 0 (primeiro caracter) e retornará um
inteiro com valor 7 (posição da letra 'e' da string "escrito" na primeira string).

Note que você deverá diferenciar minusculas de maiusculas. Para isso é interessante
fazer com que todos os caracteres da STRING a pesquisar e da STRING pesquisada
sejam minusculas antes de realizar a pesquisa. Com esse HEADER é possível fazer
isso com a função lower().
Compartilhar
Melhore esta resposta
Seguir
respondida 10/07/2020 às 22:29
Raphael's user avatar
Raphael
11744 medalhas de bronze
Adicione um comentário
0

Seu programa parece muito complicado sem necessidade. Escreva seu programa em torno
dos dados. Sempre.

Em geral quando se pede esse tipo de solução para um aluno ele aprendeu já temas
como estruturas, estruturas de dados e alocação de memória. Não sei se é o seu
caso.

Vou te dar uns palpites apenas, afinal já passou muito tempo. Se precisar ainda de
ajuda volte a escrever.

De volta ao problema
Você tem um ou mais arquivos em disco com o acervo, porque parece que mantem
revistas e livros em arquivos separados, e tem umas coisas que precisa fazer com o
acervo, como listar todos por algum critério ou editar.

Em C você pode agrupar dados em uma estrutura, declarando assim

typedef struct
{
char titulo[40];
char editora[40];
char autor[40];
int caixa;
int ano;
char ISBN[20]; // 123-4-56-789ABC-D
char tipo; // 'L' para livro
} Livro;

Um Livro. Note que pode usar tamanhos mais modestos para os campos. 1.000 letras é
um pouco exagerado para autor, título ou editora como você havia usado. E int para
ISBN, um formato estabelecido no mundo todo, é errado.

E o acervo é uma coleção de Livro. Não há razão para usar dois arquivos a menos que
o enunciado exija. E um acervo pode ser algo mínimo como

typedef struct
{
int total;
Livro livro[200]
} Acervo;
E uma biblioteca poderia ser algo assim

Acervo loja1;
loja1.total = 0;
Para começar a ler do disco o acervo da loja 1.

Em geral se usaria alocação dinâmica de memória para esses campos todos. E muitas
vezes uma lista ligada ou outra estrutura de dados para os livros. Mas pode ser
mesmo um simples vetor.
E os arquivos?
Em geral na entrada os dados do arquivo são todos lidos para um vetor de estruturas
na memória. Todo o processamento é feito nessa estrutura. Ao final do programa a
estrutura é copiada de volta para o disco com outro nome. Aí se muda o nome do
arquivo original para uma extensão de backup e se muda o arquivo novo para o nome
original. Assim se você começou com "livros.txt" vai acabar com "livros.txt" e
"livros.bak". Nada original.

Muitas vezes cada edição é salva em disco em um arquivo, quando o conteúdo é


importante. Algo como um arquivo de transações, um log. Assim se o programa
cancelar depois de horas de edição você pode entrar com um programa que abre o
arquivo original e esse log de transações e atualiza tudo antes de voltar a rodar.

Não se edita direto no arquivo porque é problemático no mínimo. É possível e


simples, são poucas funções para posicionar o arquivo, encontrar um registro,
regravar um trecho e tal. Apenas não vale o esforço a menos que o enunciado exija
usar isso. Funções simples como rewind() fseek() fopen(), fclose() e família.

Você também pode gostar