C语言中的Unix尾程序使用实现的函数

时间:2012-10-27 12:33:05

标签: c unix fgets tail

我已经实现了我自己的getline函数的动态内存版本:

char * fgetline(FILE * f)

以30个字符缓冲区开始,当缓冲区已满时,分配一个新的内容并释放旧缓冲区。当我们得到EOF\n时,我们会从函数返回。

我想使用此函数来实现程序尾部的一个版本。输入来自stdin,输出转到stdout。如果第一个参数以-开头,则-之后的所有内容都是要打印的行数。当没有给出参数时,要打印的默认行数是10。

直到现在我才想到我应该使用这个功能:

int atoi (const char *s) 

来自stdlib.h并且有一系列指向行的指针,但我不确切知道如何执行此操作。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

将您的main函数声明为

 int main (int argc, char**argv) {
 }

如果您将程序编译为myprog可执行文件,并将其作为myprog -20 somefile anotherfile调用,那么您有:

argc == 4 
&& strcmp(argv[0], "myprog") == 0
&& strcmp(argv[1], "-20") == 0
&& strcmp(argv[2], "somefile") == 0
&& strcmp(argv[3], "anotherfile") == 0
&& argv[4] == NULL

换句话说,您可能希望程序包含

int nblines = 10;

int main(int argc, char**argv) {
  int argix = 1;
  if (argc>1) {
    if (argv[1][0]=='-') 
      { 
         nblines = atoi(argv[1]+1);
         argix = 2;
      }
     for (; argix < argc; argix++)
        tail (argv[argix]);
  }
  return 0;
}

由您来适当实施void tail(char*filename);功能。不要忘记编译所有警告&amp;调试信息,例如在Linux上使用gcc -Wall -g。使用调试器(Linux上为gdb)来调试程序。考虑fopen可能失败,并使用errno显示相应的错误消息。

请注意,您不需要fgetline功能。 getline(3) {{3}}  函数是标准函数(在Posix 2008中)并且是动态分配行缓冲区。