首页 > 解决方案 > 解析文本文件(未解决的问题)

问题描述

这是一个我认为已经解决的问题,但显然我仍然到处都有小错误。下面的代码是我用来使用我为原型微控制器开发的制造语言解析文本文件的代码。基本上,每当我到达分号时,我都会将之后的任何文本视为评论并忽略它:

   `//Get characters from .j FILE`
    while (fgets(line, 1000, IN) != NULL)
    {
        //Get each line of .j file


        //Compute length of each line
        len = strlen(line);

        //If length is zero or if there is newline escape sequnce
        if (len > 0 && line[len-1] == '\n')
        {
            //Replace with null
            line[len-1] = '\0';
        }

        //Search for semicolons in .J FILE
        semi_token = strpbrk(line, ";\r\n\t");

        //Replace with null terminator
        if (semi_token) 
        {
            *semi_token = '\0';
        }
        printf("line is %s\n",line );

        //Copy each line
        assign = line;

        // printf("line is %s\n",line );

        // len = strlen(line);

        // printf("line length is %d\n",len );

        // parse_tok = strtok(line, "\r ");

    }   

上面的代码是从文本文件中获取每一行的 while 循环。如果我有以下格式的文件,一切正常:

;;
;; Basic
;;

defun test arg3 arg2 arg1 min return 
;defun love arg2 arg1 * return
;defun func_1 6 6 eq return
;defun func_2 20 100 / return

defun main
0 -200 55 test printnum endl
;1 2 3 test printnum endl
;38 23 8 test printnum endl
;5 6 7 love printnum endl
;love printnum endl
;func_1 printnum endl
;func_2 printnum endl
return

观察输出:

line is 
line is 
line is 
line is 
line is defun test arg3 arg2 arg1 min return 
line is 
line is 
line is 
line is 
line is defun main
line is 0 -200 55 test printnum endl
line is 
line is 
line is 
line is 
line is 
line is 
line is return

问题在于我的文本文件在嵌套语句的情况下有选项卡:

;;
;; program to test nested ifs
;;

defun testIfs ;; called with one parameter n

arg1           ; get n to the top of the stack

dup 16 gt
if   ; 16 > n

    dup 8 gt
    if  ; 8 > n

        dup 4 gt
    if  ; 4 > n
        0
    else        ; 4 <= n
        1
    endif

    else        ; 8 <= n
       2
    endif

else        ; 16 <= n

     dup 24 gt
     if ; 24 > n

        dup 20 gt
    if  ; 20 > n
           3
        else        ; 20 <= n
           4
    endif

     else           ; 24 <= n

        dup 32 gt
        if  ; 32 > n
           5
    else
        -10
        endif

     endif

endif

return


defun main 
5 testIfs printnum endl
11 testIfs printnum endl
28 testIfs printnum endl
35 testIfs printnum endl
return

观察输出:

line is 
line is 
line is 
line is 
line is defun testIfs 
line is 
line is arg1           
line is 
line is dup 16 gt
line is if   
line is 
line is     dup 8 gt
line is     if
line is 
line is     
line is 
line is 
line is 
line is 
line is 
line is 
line is     else
line is        2
line is     endif
line is 
line is else
line is 
line is      dup 24 gt
line is      if
line is 
line is      
line is 
line is            3
line is         else   
line is            4
line is 
line is 
line is      else   
line is 
line is         dup 32 gt
line is         if
line is            5
line is 
line is 
line is         endif
line is 
line is      endif
line is 
line is endif
line is 
line is return
line is 
line is 
line is defun main 
line is 5 testIfs printnum endl
line is 11 testIfs printnum endl
line is 28 testIfs printnum endl
line is 35 testIfs printnum endl
line is return

如您所见,它跳过(似乎是随机地)某些带标签的行,我不知道它为什么这样做。在我的代码中需要修改哪些内容,以便它不会随机跳过某些带标签的行?任何帮助表示赞赏!

标签: cparsingwhile-loopstrtok

解决方案


这是查找分号的部分:

    //Search for semicolons in .J FILE
    semi_token = strpbrk(line, ";\r\n\t");

它明确地将制表符视为与分号相同,即开始注释。至于为什么这个错误并不总是发生 - 我猜有时你的编辑器会将输入文件\t中的制表符()字符转换为空格。*.J


推荐阅读