簡體   English   中英

用C解析文件以讀取char

[英]Parse file in C to read char

假設我有一個文件,文件中填充了帶有空格的隨機字符,並且\\ n也包含隨機字符。

我想查找這組字符,例如:UU,II,NJ,KU。 因此,目的是讀取文件,查找此類分組並說出文件中有多少組。

我的問題是空格和\\ n,如果我找到其中之一,則應該跳過它並再次搜索組。 我找到了一個對我有幫助的解決方案strtok_r函數。

http://www.codecogs.com/reference/computing/c/string.h/strtok.php?alias=strtok_r

我認為這將隔離完整的字符串,因此我可以一次閱讀一個。

這是一個好的解決方案還是應該采用其他方法?

一個幼稚的解決方案可能是一次讀取一個字符,當它是'U''I''N''K'然后讀取另一個字符以查看它是否是該組中的下一個字符。 如果是,則增加該組的計數器。 所有其他字符都將被簡單丟棄。

編輯:示例函數:

int count_uu = 0;
int count_ii = 0;
int count_nj = 0;
int count_ku = 0;

void check_next_char(int expected, FILE *input, int *counter);

void count(FILE *input)
{
    int ch;  /* Character we read into */

    while ((ch = fgetc(input)) != EOF)
    {
        switch (ch)
        {
        case 'U':
            check_next_char('U', input, &count_uu);
            break;
        case 'I':
            check_next_char('I', input, &count_ii);
            break;
        case 'N':
            check_next_char('J', input, &count_nj);
            break;
        case 'K':
            check_next_char('U', input, &count_ku);
            break;

        default:
            /* Not a character we're interested in */
            break;
    }
}

/* This function gets the next character from a file and checks against
   an `expected` character. If it is same as the expected character then
   increase a counter, else put the character back into the stream buffer */
void check_next_char(int expected, FILE *input, int *counter)
{
    int ch = fgetc(input);
    if (ch == expected)
        (*counter)++;
    else
        ungetc(ch, input);
}

您也可以使用

https://github.com/leblancmeneses/NPEG/tree/master/Languages/npeg_c

如果您的搜索模式變得更加困難。

這是可以導出C版本的可視化工具: http : //www.robusthaven.com/blog/parsing-expression-grammar/npeg-language-workbench

規則語法的文檔: http : //www.robusthaven.com/blog/parsing-expression-grammar/npeg-dsl-documentation

規則

    (?<UU>): 'UU'\i; 
(?<II>): 'II'\i; 
(?<NJ>): 'NJ'\i; 
(?<KU>): 'KU'; // does not use \i so is case sensitive 

Find: UU / II / NJ / KU;
(?<RootExpression>): (Find / .)+;

輸入1:

 UU, II, NJ, KU  uu, ii, nJ, kU

輸入2:

jsdlfj023#uu, ii, nJ, kU $^%900oi)()*()  UU, II, NJ, KU  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM