2012-10-26 65 views
0

假设我有一个文件填充随机字符与空格和\ n也包括随机。解析文件在C读取字符

我想寻找这组字符,例如:UU,II,NJ,KU。所以目的是读取文件,寻找这种类型的组,并说出它们在文件中的数量。

我的问题是空白和\ n,因为如果我找到其中一个我应该跳过它并再次搜索组。我找到了一个可以帮助我的解决方案,功能strtok_r

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

我认为这将隔离满弦,所以我可以读一下午时间。

这是一个很好的解决方案还是应该采取其他方法?

+0

逐行读取文本文件,并在缓冲区中读取strstr()。用'strtok_r()'你会产生不必要的令牌。 – SparKot

+4

你应该总是考虑角落案例,所以我们不必问。如果你看到UUU或KUU会怎么样? –

+0

我不会,我会读字符char,但过程2乘2,这意味着生病看到你,然后看到另一个U和计数++,然后生病阅读下一个字符等,如果我发现一个空白或任何不同于一个字母,我会放弃它,并且使用strtok_r()之前已阅读的字符 – nhenrique

回答

4

一个天真的解决方案可能会在一次读一个字符,当它的'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); 
} 
+0

“如果是,然后增加一个计数器为该组”我将重新措辞它“实现一个状态机”。 – anishsane

+0

一个状态机似乎是实现耶!我想要做的不是读取空白和\ n。想象一下,我有一个非常大的文件,用strtok我不会读这些“字符”的权利? – nhenrique

+0

@nunobhorta你必须阅读所有的字符,甚至空白。如果你阅读char-by-char,就像在我的答案中,或者读取blockwise并不重要。但是,您可以像跳过其他任何不感兴趣的角色一样跳过它。 –

0

你也可以使用

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