如何从C中的文件读取两个连续的字符?

用户名

我有以下代码,在这里我想为一种简单的计算器语言创建一个简单的扫描仪。我正在使用fgetc从文件中获取字符。但是,在某些地方,我还需要检查接下来的下一个字符。因此,我一直在使用++运算符,但似乎无法正常工作。有人可以帮我解决我的问题吗?

例如,当我的文本文件中包含:=时,它将打印冒号,然后显示一条错误消息:“;无法跟随:(冒号)。”,而应打印“赋值”。

这是我的完整代码:

#include <regex.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

int main(int argc, char** argv)
{
    FILE *fp;
    int c, check, reti_d, reti_l;

    regex_t digit, letter;
    reti_d = regcomp(&digit, "[0-9]", 0);
    reti_l = regcomp(&letter, "[a-zA-Z]", 0);

    if (reti_d || reti_l)
    {
        fprintf(stderr, "Couldn't compile the regular expression(s).\n");
        exit(1);
    }

    if (argc != 2)
    {
        fprintf(stderr, "Usage: %s filename.txt\n", argv[0]);
        exit(1);
    }

    if (!(fp = fopen(argv[1], "r")))
    {
        perror("Error opening file!\n");
        exit(1);
    }

    while ((c = fgetc(fp)) != EOF)
    {
        char regdtest[1];
        char regltest[1];
        regdtest[0] = (char)c;
        reti_d = regexec(&digit, regdtest, 0, NULL, 0);
        reti_l = regexec(&letter, regltest, 0, NULL, 0);

        switch (c)
        {
            case '(': printf("lperen "); break;
            case ')': printf("rparen "); break;
            case '+': printf("plus "); break;
            case '-': printf("minus "); break;
            case '*': printf("times "); break;
        }

        if (c == ':')
        {
            if (c++ == '=')
                printf("assign ");
            else printf("\n%c cannot follow : (colon).\n", (char)c);
        }

        if (c == '/')
        {
            if (++c == '/' || ++c == '*')
            {
                while (c != '\n' || (c == '*' && ++c == '/'))
                    c++;
            }
            else printf("div ");
        }

        if (c == '.')
        {
            regdtest[0] = (char)++c;
            reti_d = regexec(&digit, regdtest, 0, NULL, 0);

            if (!reti_d)
            {
                printf("number ");
            }
            else printf("\n. (dot) should be followed by digits.\n");
        }

        if (!reti_d)
        {
            while (!reti_d)
            {
                regdtest[0] = (char)c;
                reti_d = regexec(&digit, regdtest, 0, NULL, 0);
            }

            printf("number ");
        }

        if (!reti_l)
        {
            int i, j = 0;
            char read[5], write[6];
            read[i] = write[j] = (char)c;

            while(!reti_d || !reti_l)
            {
                c++;
                i++;
                j++;

                if (i >= 5)
                    i = 0;
                if (j >= 6)
                    j = 0;

                read[i] = write[j] = (char)c;
                if (strcmp(read, "read") == 0)
                    printf("read ");
                else printf("id ");

                if (strcmp(write, "write") == 0)
                    printf("write ");
                else printf("id ");

                regdtest[0] = (char)c;
                regltest[0] = (char)c;
                reti_d = regexec(&digit, regdtest, 0, NULL, 0);
                reti_l = regexec(&letter, regltest, 0, NULL, 0);
            }

            printf("letter ");
        }

    }

    fclose(fp);
    return 0;
}
mg

您需要通过fgetc()再次调用来获得第二个字符

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在python中一次读取文件中的两个非连续行

C:如何比较链表中连续的两个节点?

(C ++)如何将.txt文件中的两列数据读取为两个向量?

如何读取字符串直到连续两个空格?

如何从 C 中的文件中逐行读取每行的两个字符串

无法连续读取两个不同的文件

如何从多个块一次读取两个连续块的数据,直到文件结束?

如何在python中的字符串中搜索两个连续的字符

从两个 CSV 文件中读取

如何使用Regex查找RGB中两个连续的重复字符?

如何在Java字符串中替换两个连续的反向逗号“”?

如何从公式/字符串中删除两个连续的加号 (+)?

如何在JavaScript中删除具有两个管道字符的连续管道

如何从一个文件夹中读取两个文件?

在Bash中:从文件中读取两个整数,而忽略它们之间的字符。

一组两个文件中具有序列的 N 个相同连续字符的比较

如何在C中链接两个文件

如何在Angular中显示两个连续的空间?

如何计算数组中的两个连续值

如何在Vim中映射两个连续的Shift?

Python中两个连续的yield语句如何工作?

如何在SQL中创建两个连续的Group By

C中两个连续的printf()调用的奇怪行为

在C#中连续执行两个事件

如何在Perl中编写算法以从两个文件中读取数据并匹配并打印查询

从 C++ 中的文本文件中读取两个十六进制值

如何为Bash中两个不同文件中的两个不同字符串的输出着色

C程序读取两个'*'之间的字符

比较C中两个while循环中两个文件中的字符串