用C语言解析文件以读取字符

用C语言解析文件以读取字符,c,file,parsing,strtok,C,File,Parsing,Strtok,假设我有一个文件,其中填充了带空格的随机字符,并且\n也包含随机字符 我想寻找这组字符,例如:UU,II,NJ,KU。因此,目的是读取文件,查找此类组,并说出文件中有多少组 我的问题是空白和\n,因为如果我找到其中一个,我应该跳过它并再次搜索组。我找到了一个可以帮助我的解决方案,函数strtok\u r 我认为这将隔离完整的字符串,以便一次可以读取一个字符串 这是一个好的解决方案还是应该采取其他方法?一个简单的解决方案可能是一次读取一个字符,当它是'U','I','N'或'K'时,再读取另一个

假设我有一个文件,其中填充了带空格的随机字符,并且\n也包含随机字符

我想寻找这组字符,例如:UU,II,NJ,KU。因此,目的是读取文件,查找此类组,并说出文件中有多少组

我的问题是空白和\n,因为如果我找到其中一个,我应该跳过它并再次搜索组。我找到了一个可以帮助我的解决方案,函数strtok\u 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);
}

一个简单的解决方案可能是一次读取一个字符,当它是
'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);
}
你也可以使用

如果您的搜索模式变得更加困难

下面是一个可以导出C版本的可视化工具:

规则语法文档:

规则

投入2:

jsdlfj023#uu, ii, nJ, kU $^%900oi)()*()  UU, II, NJ, KU  
你也可以使用

如果您的搜索模式变得更加困难

下面是一个可以导出C版本的可视化工具:

规则语法文档:

规则

投入2:

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

逐行读取文本文件,并在缓冲区上读取
strstr()
。使用
strtok_r()
您会产生不必要的代币。您应该始终考虑一些特殊情况,这样我们就不用问了。如果你看到UUU或KUU会发生什么?我不知道,我会一个字符一个字符地读,但会处理2乘2,这意味着我会看到U,然后看到另一个U和count++,然后我会读下一个字符,依此类推,如果我发现一个空格或任何与字母不同的字符,我会丢弃它和我在使用strtok_r()之前读过的字符是一个很好的解决方案,因为它可以在循环中使用。如果将NULL作为第一个参数传递,它将返回下一个标记。在使用strstr()时,您必须维护一个指针来跟踪您已经读取的内容。使用strtok_r()逐行读取文本文件,并在缓冲区上使用
strstr()
。使用
strtok_r()
您会产生不必要的代币。您应该始终考虑一些特殊情况,这样我们就不用问了。如果你看到UUU或KUU会发生什么?我不知道,我会一个字符一个字符地读,但会处理2乘2,这意味着我会看到U,然后看到另一个U和count++,然后我会读下一个字符,依此类推,如果我发现一个空格或任何与字母不同的字符,我会丢弃它和我在使用strtok_r()之前读过的字符是一个很好的解决方案,因为它可以在循环中使用。如果将NULL作为第一个参数传递,它将返回下一个标记。在使用strstr()时,您必须维护一个指针来跟踪您已经读取的内容。选择strtok_r()“如果是,那么为该组增加一个计数器”我将把它改为“实现一个状态机”。状态机似乎是要实现的东西耶!我想做的不是读取空白和\n。想象一下,我有一个非常大的文件,用strtok我不会读那些“字符”,对吗?@nunoborta你必须读所有字符,甚至是空格。如果你像我的回答那样逐字读,或者按块读都没关系。但是,您可以跳过它,就像您不感兴趣的任何其他字符一样。@Nunoborta添加了我在回答中概述的解决方案的一个可能实现。如果文件包含WUT或NJQ,UU和NJ将被计算,但不应是“如果是,则为该组增加一个计数器”,我会将其改为“实现一个状态机”一个状态机似乎是要实现的东西耶!我想做的不是读取空白和\n。想象一下,我有一个非常大的文件,用strtok我不会读那些“字符”,对吗?@nunoborta你必须读所有字符,甚至是空格。如果你像我的回答那样逐字读,或者按块读都没关系。但是,您可以跳过它,就像您不感兴趣的任何其他字符一样。@Nunoborta添加了我答案中所述解决方案的一个可能实现。如果文件包含WUT或NJQ,UU和NJ会被计算,但不应该被计算