事情是这样的。这学期的C语言课程期末的大作业(说实话我不太愿意称其为“项目”……),就像我的前几篇博文里提到的,要求编写一个程序,可以读入一串字符,包含声明变量、求值、打印的功能。如何进行词法分析和构建表达式树的过程在前两篇文章我已经说过了,这里不再赘述。那么很多同学问起来的一个问题是,在作业的要求里面,有一项是“从第一个命令行参数读入文件名”——这个到底是什么意思?

有些同学把它理解成了从标准输入获取一个文件名的字符串。大错特错啦。不过也难怪,我们这个年代的人小时候接触DOS的机会不多了,可能从小到大根本就没有在计算机上敲过命令,以至于第一次写C程序的时候看到那个黑漆漆的窗口还大失所望。

不过现在好了,至少你晓得了电脑上某一个“角落”存在着这样一个“黑框”,你可以在上面输入东西。在Windows系统上,我们可以通过开始-运行(没有开始菜单的话就按Win+R键),弹出“运行”窗口,输入cmd然后回车。这样我们就打开了一个“命令提示符”窗口。(什么,你用的是Linux?用Linux还不知道命令参数是什么,我劝你还是卸了吧)

这个窗口在Windows NT系统里可以作为对DOS界面的一种模拟,因为不是所有的Windows应用程序都有图形界面的,比如我们现在写的C程序就没有,所谓的标准输入和输出只能在cmd模拟器里面跑。(如果你对命令行窗口仍有疑惑,可以参考我在知乎上的这个回答)在黑窗下,我们可以尝试敲敲一些命令:

  • dir,列出当前所在目录下的文件
  • cd,进入某个目录,cd ..表示回到上一层目录
  • 盘符,进入某个分区,比如输入D:回车表示进入D盘
  • exit,退出命令提示符
  • del,删除某个文件(注意可没有回收站让你反悔)
  • 把文件拖动到命令窗口,命令会自动显示这个文件的路径,直接输入文件名回车系统会调用适合的程序打开它

好了,基本的操作我们已经熟悉了。这样已经够了。对啊,比如说我们用del命令的时候,del a.txt,这里的a.txt就是del命令的命令行参数!在Windows下,我们的程序最后会编译成某个.exe文件,IDE执行它是自动启动的,不会给我们输入命令行参数的机会(讲道理的话是可以设置的)。假设我们编译成某个可执行程序,放在当前所在的目录下,比如说,叫mao.exe吧,然后源文件名叫做mao.mao,我们这样输入:

mao.exe mao.mao

系统会给mao.exe应用程序的main函数传入argv参数。不过前提是你要写对main函数的原型,像这样:

int main(int argc, char *argv[])
{
    /* 代码在这里 */
    return 0;
}

那么对于上面的例子,我们的两个参数的值应该是这样的:argc=2,argv[0]="mao.exe",argv[1]="mao.mao".(唔也有可能是完整路径,懒得测了)然后我们打开文件的话,像这样打开就行了:

#include <stdio.h>

int main(int argc, char *argv[])
{
    if (argc &gt; 1) {
        FILE *fp;
        if ((fp = fopen(argv[1], "r")) == NULL) {
            printf("Open file failed.\n");
        } else {
            /* 打开之后的操作在这里 */
            fclose(fp);
            /* 不要忘记了关闭 */
        }
    } else {
        printf("Not enough parameters!\n");
    }
    return 0;
}

当然我的代码仅仅只作为一个参考,抄去说不定程序会崩哦。

好了,如何操作我们就先说到这里。你可能会纳闷——为什么要弄得这么麻烦?

  • 普通回答:为了让同学们熟悉一下文件操作和命令行参数的知识,提高自己查找知识解决问题的能力
  • 二逼回答:因为助教用的是Linux,这样做会很方便
  • 文艺回答:每一个C程序员都要对Unix系系统有亲近感,这是培养亲近感的很好的方式

好吧,今天就说到这里,如果你们对Linux有兴趣,下次可以专门聊聊。