Поиск ключевого слова в текстовом файле и регистрация его с помощью C
Я пытаюсь использовать C для поиска файла, который содержит C-код. Он предназначен для поиска по всему файлу, поиска определенных ключевых слов или символов (таких как поиск Ints, Longs, для циклов For и т. Д.) И регистрации их путем увеличения счетчика, а также подсчета всех строк кода. Затем предполагается указать общее число каждого, поэтому проценты можно рассчитать на основе того, как часто ключевое слово появляется в файле.
Тем не менее, у меня проблемы с получением кода для распознавания ключевых слов. Как я должен получить это, чтобы прочитать общие строки кода, а также искать ключевые слова?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _CRT_SECURE_NO_WARNINGS
/* Count and compute:
number of total lines
number and percentage of blank lines
number and percentage of comments (start with // or /*)
number and percentages of ints, longs, floats, doubles, char
number and percentages of if's
number and percentage of else's
number and percentage of for's
number and percentage of switch
number and percentage of semicolons
number and percentage of structs
number and percentage of arrays (contains [ or ], divide count by 2)
number of blocks (contains { or }, divide count by 2)
*/
int main(void)
{
int lineCount = 0; // Line counter (result)
int forCount = 0; // For counter
int intCount = 0;
char c;
FILE *ptr_file;
char buf[1000];
ptr_file = fopen("file.txt", "r");
if (!ptr_file)
return 1;
while (fgets(buf, 1000, ptr_file) != NULL) {
for (c = getc(ptr_file); c != EOF; c = getc(ptr_file)) {
if (c == '\n') // Increment count if this character is newline
lineCount = lineCount + 1;
}
}
fclose(ptr_file);
//End of first scan
ptr_file = fopen("file.txt", "r");
if (!ptr_file)
return 1;
while (fgets(buf, 1000, ptr_file) != NULL) {
for (c = getc(ptr_file); c != EOF; c = getc(ptr_file)) {
if (c == 'for') // Increment count if this character is for
forCount = forCount + 1;
}
}
fclose(ptr_file);
//End of second scan
ptr_file = fopen("file.txt", "r");
if (!ptr_file)
return 1;
while (fgets(buf, 1000, ptr_file) != NULL) {
for (c = getc(ptr_file); c != EOF; c = getc(ptr_file)) {
if (c == 'int') // Increment count if this character is for
intCount = intCount + 1;
}
}
fclose(ptr_file);
printf("\nThe file has %d lines\n", lineCount);
printf("\nThe file has %d fors\n", forCount);
printf("\nThe file has %d ints\n", intCount);
}
2 ответа
Вам нужно использовать sscanf и анализировать его построчно.
Для каждого найденного предмета ведение счета не должно быть проблемой.
Но, как вы уже обсуждали (просили помощи на другом форуме), вам нужна эта функция.
Чтобы получить точный ответ, может потребоваться более сложный анализ, чем вы думаете: подумайте на минуту, что long
также может быть объявлен как long int
и что либо long long
или же long long int
также допустимы объявления переменных. Кроме того, вы можете объявить несколько переменных в одной строке, и вы не хотите считать случаи, когда int
является частью более длинного слова.
Для быстрого приближения, инструменты Linux grep
, а также wc
может быть полезно:
wc -l filename
перечислит количество строк файлаgrep "for" filename | wc -l
перечислит количество строк, в которыхfor
Включено
Обратите внимание, что это приблизительные значения: если for
происходит более одного раза в строке, или for
является частью другого слова, как forth
один экземпляр все равно будет засчитан.