使程序与输入和文件一起工作

Make a program work with input and a file

我正在制作一个仅适用于键盘输入的 shell 解释器,但我必须使其适用于文本文件。

int main(int argc, char *argv[], char *envp[]) {
  string comando;
  mi_argv[0] = NULL;
  int pid_aux;    
  el_prompt = "$> ";

  if(argv[1] != NULL)
  {
    ifstream input(argv[1]);
    if (!input)
    {
        cerr << "No se reconoce el archivo " << argv[1] << endl;
        exit(EXIT_FAILURE);
    }
  }

  while(!cin.eof())
  {
     cout << el_prompt;
     getline(cin, comando);
  ...
  }
} 

关键是要使它与参数 ./shell file.txt 这样的文件一起工作。我试图将文件重定向到 cin,但我不知道该怎么做。

将从输入流中读取的代码放在一个单独的函数中,并将对输入流的引用传递给该函数。然后您可以将任何输入流传递给该函数,您打开的文件或 std::cin.

例如

void main_loop(std::istream& input)
{
    // Use `input` here like any other input stream
}

现在您可以使用标准输入调用函数

main_loop(std::cin);

或您的文件

main_loop(input);

此外,请注意该循环条件,执行 while (!stream.eof()) 在大多数情况下不会按预期工作。原因是 eofbit 标志直到 你尝试从流的末尾读取之后才设置,并且会导致循环 运行加时一次。

而是做例如while (std::getline(...)).

像这样。

#include <string>
#include <iostream>
#include <fstream>


void usage() {
    std::cout << "Usage: shell <filename>\n";
}

int main(int argc, char* argv[]) {
    std::string comando;
    std::string el_prompt = "$> ";

    if (argc != 2) {
        usage();
        exit(1);
    }

    std::ifstream input(argv[1]);
    while (std::getline(input, comando)) {
        std::cout << el_prompt << comando;
    }
}

您当然需要代码来解析命令并执行它。