c - 解析文本文件(未解决的问题)
问题描述
这是一个我认为已经解决的问题,但显然我仍然到处都有小错误。下面的代码是我用来使用我为原型微控制器开发的制造语言解析文本文件的代码。基本上,每当我到达分号时,我都会将之后的任何文本视为评论并忽略它:
`//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
如您所见,它跳过(似乎是随机地)某些带标签的行,我不知道它为什么这样做。在我的代码中需要修改哪些内容,以便它不会随机跳过某些带标签的行?任何帮助表示赞赏!
解决方案
这是查找分号的部分:
//Search for semicolons in .J FILE
semi_token = strpbrk(line, ";\r\n\t");
它明确地将制表符视为与分号相同,即开始注释。至于为什么这个错误并不总是发生 - 我猜有时你的编辑器会将输入文件\t
中的制表符()字符转换为空格。*.J
推荐阅读
- vue.js - 更改 element-ui Select 中的图标
- python - 为什么我的石头剪刀布游戏不启动while循环?
- jenkins - 如何在詹金斯中获得并行构建作业结果
- python - 美丽的汤没有找到基本的 HTML 数据
- node.js - Package.json 有一个实际上不存在的 Package 版本。怎么了?
- reactjs - 如何避免反应日期选择器日历在上一个文本框中的选项卡按键上打开
- django - 如何在 Django 中使用带问号的 URL 执行查询?
- android - Lazy initialization with repository
- java - 在圆形双链接结构中链接节点
- python-3.x - 使用 functools.reduce 时出现属性错误