Sharon Shelton Ответов: 3

Как сделать этот код подсчета количества встречаемости слова в файле лучше?


Я пытаюсь написать код, чтобы найти число встречаемости слова в файле. По некоторым причинам мой код не работает должным образом. Как новичок, я хотел бы получить некоторую помощь. Большое спасибо!!

Что я уже пробовал:

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
int main(){
	FILE *fptr,*ptr;
	int l,i=0,count=0,total=0;
	char name[50],n,word[25],k;
	printf("\nEnter the file name:");
	scanf("%s",name);
	printf("\nEnter the word to be found:");
	fgets(word,25,stdin);
	l=strlen(word);
	fptr=fopen(name,"r");
	if(fptr==NULL){
		printf("\nProblem with opening the file");
		exit(1);
	}
	n=fgetc(fptr);
	while(!(feof(fptr))){
		if(n==toupper(word[i])||n==tolower(word[i])){
			count++;
			if(count==1){
				ptr=fptr;
			}
			i++;
		}
		else if(n!=word[i]){
			if(count>1){
				fptr=ptr;
			}
			count=0;
			i=0;
		}
		if(count==l){
			total++;
			count=0;
			i=0;
		}
		n=fgetc(fptr);
	}
}

Patrice T

Определите "мой код не работает должным образом"

Garth J Lancaster

Не могли бы вы подробнее рассказать о том, что "мой код не работает должным образом" ... что он делает .. кроме того, ваш код не имеет комментариев - комментирующий код полезен по двум причинам - он позволяет другим узнать, каковы ваши намерения, и, комментируя, Вы читаете то, что написали, и видите, имеет ли это смысл

Кроме того - мы ничего не знаем о формате вашего входного файла - это одно слово на строку, или предложения, или ?? есть более быстрые способы прочитать файл, если он содержит одно слово в строке, и вы можете избежать чтения символов по символам

3 Ответов

Рейтинг:
1

Luc Pattyn

Вы даже не можете начать справляться с этим, прежде чем вы четко определили задачу. Что такое вхождение вашего слова? нужно ли ему иметь соответствующий футляр? считается ли это частью другого слова? а как насчет множественного числа? а дефисные слова (разбитые на две или более строк)?

Когда эти требования будут очищены, поместите их в комментарий в начале вашего кода!

Для реализации не обрабатывайте его по одному символу за раз; я также не стал бы читать весь файл сразу, в этом нет необходимости; вероятно, работа с одной строкой текста за раз была бы правильным подходом.

Наконец, в зависимости от требований, может быть довольно много возможностей для оптимизации...

:)


Рейтинг:
0

OriginalGriff

Зависит от того, что вы подразумеваете под "лучше" - это очень субъективная вещь.

Для меня первым улучшением было бы перестать использовать односимвольные переменные и документировать свой код, чтобы было гораздо более очевидно, что вы делаете и почему.

И я, вероятно, обработаю файл в отдельные слова, отсортирую их, посчитаю и сохраню эти два элемента вместе в одном файле. struct с массивом из struct предметы.

Тогда поиск становится тривиальным. И он не считает "частичные" слова: найдите свое "В", и оно будет считать "внутри", а также "внутри", "ацетофенетидин", "мусорное ведро", "окно" и так далее как "совпадения" ...


Рейтинг:
0

KarstenK

Лучше всего прочитать весь файл и чем пользоваться функции strtok Внимательно прочитайте пример, чтобы использовать его правильно. Эта функция чувствительна к регистру, поэтому вы можете искать свое слово, начиная с верхнего регистра. Создайте копию слова с первой буквой как верхний регистр.