LinuxSir.cn,穿越时空的Linuxsir!

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

[求助]Linux/Unix下一个模仿cat的程序的问题

[复制链接]
发表于 2005-3-19 00:07:09 | 显示全部楼层 |阅读模式
最近要编一个程序,简单地模仿Linux/Unix下的cat
以下是我的两个版本

  1. //h.cpp
  2. #include <iostream>
  3. #include <fstream>
  4. #include <string.h>

  5. using namespace std;

  6. inline void display(istream& istrm);

  7. int main(int argc, char* argv[])
  8. {
  9.    if (argc==1) display(cin);
  10.    for(int i=1; i<argc; ++i)
  11.    {
  12.       if (strcmp(argv[i], "-")==0)
  13.       {
  14.          display(cin);
  15.          continue;
  16.       }
  17.       ifstream in(argv[i]);
  18.       if (!in)
  19.       {
  20.          cerr<<("%s", argv[0])<<": "<<("%s", argv[i])
  21.              <<": No such a file or directory!"<<endl;
  22.          continue;
  23.       }
  24.       display(in);
  25.    }
  26.    return 0;
  27. }

  28. inline void display(istream& istrm)
  29. {
  30.    char buf;
  31.    while(istrm.get(buf)) cout.put(buf);
  32. }
复制代码

-------------------------------------------

  1. //i.cpp
  2. #include <iostream>
  3. #include <fstream>
  4. #include <iterator>
  5. #include <string.h>

  6. using namespace std;

  7. inline void display(istream& istrm);

  8. int main(int argc, char* argv[])
  9. {
  10.    if (argc==1) display(cin);
  11.    for(int i=1; i<argc; ++i)
  12.    {
  13.       if (strcmp(argv[i], "-")==0)
  14.       {
  15.          display(cin);
  16.          continue;
  17.       }
  18.       ifstream in(argv[i]);
  19.       if (!in)
  20.       {
  21.          cerr<<("%s", argv[0])<<": "<<("%s", argv[i])
  22.              <<": No such a file or directory!"<<endl;
  23.          continue;
  24.       }
  25.       display(in);
  26.    }
  27.    return 0;
  28. }

  29. inline void display(istream& istrm)
  30. {
  31.    istreambuf_iterator<char> inpos(istrm);
  32.    istreambuf_iterator<char> endpos;
  33.    ostreambuf_iterator<char> outpos(cout);
  34.    while(inpos!=endpos)
  35.    {
  36.       *outpos=*inpos;
  37.       ++inpos;
  38.       ++outpos;
  39.    }
  40. }
复制代码

本来h.cpp已经工作的不错了,但存在一个bug
对于cat命令来说,在控制台下输入cat - -这个命令时,cat将显示你从控制台输入的东西,要按Ctrl+D先退出第一个'-',再按一次Ctrl+D退出第二个
但我的h.cpp中,你只要按了一次Ctrl+D,就全部退出了
于是我将h.cpp改为i.cpp
在我的Linux FC3下,i.cpp不存在那个bug,但是在学校的SunOS 5.8下,那个bug又出现了
我的问题是,怎样才能彻底地去掉这个bug?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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