LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 651|回复: 4

请问:由一个文本生成另一个文本的问题

[复制链接]
发表于 2004-8-18 01:57:57 | 显示全部楼层 |阅读模式
现在我有一个名为decihex.asm的文本,我想用C或者C++实现以下的功能:

将decihex.asm 中的类似于mov ah,1的语句在另一个名为output.txt的文本中变为fprintf(code,"mov ah,1");
请问如何实现?我已经做出了一部分,不过有几个问题不明白:
1。字符“应该怎么输出?
2。如何使linebuf中可产生适当的空格,即当它遇到行的结尾时,不会打印出来?
3。代码中fgets前面还有一个判断是不是文件结束的,但是我加入
if(!source)或者(source!=EOF)好像都不行,请问应该怎么判断?

请指点,谢谢。以下是我写的一部分代码,有不好的地方请批评指正:

#define BUFLEN 80
static char bufline[BUFLEN];
FILE *source;
FILE *listing;

int main()
{
        char ch1 = ' " ';
        char ch2 = ')' ;
        char ch3 = ';';
        if( (source=fopen("decihex.asm","r")) == NULL)
        {
                exit(1);
        }
        if( (listing = fopen("outfile.txt","w")) == NULL)
        {
                exit(0);
        }
        if(fgets(bufline,80,source) )
        {
                fprintf(listing,"%s %c %s %c %c %c \n", "fprintf(code,",ch1,bufline,ch1,ch2,ch3);
        }
        return 0;
}
 楼主| 发表于 2004-8-18 02:05:45 | 显示全部楼层
在我的上面的程序中,假如输入是
mov ah,1
mov bl,al

那么输出为
fprintf(code,   mov ah,1
   ) ;

请问怎么才能实现类似正面的输出:
fprintf(code,"mov ah,1\n");
fprintf(code,"mov bl,al\n");

不知道我有没有把上面的第二点表述清楚,我是想让它在读入linebuf后,遇到串结尾符则停止,不要打印太多的空格以致后面的符号在下一行。
我曾经度过用strcat,但是 引号 还是打印不出来。
发表于 2004-8-18 08:54:29 | 显示全部楼层
给你改了一下:

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define BUFLEN 80

  4. int main()
  5. {
  6.         static char bufline[BUFLEN];
  7.         FILE *source;
  8.         FILE *listing;
  9.         int len;

  10.         if( (source=fopen("decihex.asm","r")) == NULL)
  11.         {
  12.                 exit(1);
  13.         }

  14.         if( (listing = fopen("outfile.txt","w")) == NULL)
  15.         {
  16.                 exit(0);
  17.         }

  18.         while (fgets(bufline,80,source))
  19.         {
  20.                 len = strlen(bufline) - 1;
  21.                 if (bufline[len] == '\n')
  22.                         bufline[len] = '\0';
  23.                 fprintf(listing,"fprintf(code, "%s");\n", bufline);
  24.         }

  25.         return 0;
  26. }
复制代码

你原来程序中的问题:
(1)你把最后的 while 错写成了 if,当然只能输出一行了
(2)你没有处理输入文件每行最后的那个换行符
发表于 2004-8-18 08:58:07 | 显示全部楼层
字符串匹配可以用DFA,自己写嫌麻烦的话,就用bison好了。要打印引号,要用\"表示的。
 楼主| 发表于 2004-8-18 13:10:06 | 显示全部楼层
谢谢!

终于可以用了。呵呵  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表