【问题标题】:Make a program work with input and a file使程序与输入和文件一起工作
【发布时间】:2015-05-17 09:37:18
【问题描述】:

我正在制作一个仅适用于键盘输入的 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,但我不知道该怎么做。

【问题讨论】:

标签: c++ file input getline cin


【解决方案1】:

将从输入流读取的代码放在一个单独的函数中,并将对输入流的引用传递给该函数。然后你可以将任何输入流传递给函数,你打开的文件或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(...)).

【讨论】:

  • 完美配合键盘输入,但是当我使用文件时,打印所有命令然后打印提示,可能是线程问题。有文件时我会删除提示,但如果您有更好的解决方案,我将不胜感激。非常感谢!
【解决方案2】:

类似的东西。

#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;
    }
}

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

【讨论】:

    猜你喜欢
    • 2017-09-30
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    相关资源
    最近更新 更多