在txt文件中搜索关键字并使用C [关闭]进行记录

问题描述 投票:0回答:2

我正在尝试使用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);
}
c fopen fgets getc
2个回答
1
投票

你需要使用sscanf并逐行解析它。

对于发现保持计数的每个项目应该没有问题。

但正如您所讨论的(在其他论坛上寻求帮助),您需要的功能就是这个功能。


0
投票

得到一个确切的答案可能需要比你想象的更复杂的解析:考虑一下long也可能被声明为long int,并且long longlong long int也是有效的变量声明。此外,您可以在同一行声明多个变量,并且您不希望计算int是较长单词的一部分的实例。

为了快速推算,Linux工具grepwc可能会有所帮助:

  • wc -l filename将列出文件的行数
  • grep "for" filename | wc -l将列出包含for的行数

请注意,这些是近似值:如果for在一条线上出现不止一次,或者for是另一个单词(如forth)的一部分,则仍会计算一个实例。

© www.soinside.com 2019 - 2024. All rights reserved.