使程序与输入和文件一起工作
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;
}
}
您当然需要代码来解析命令并执行它。
我正在制作一个仅适用于键盘输入的 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;
}
}
您当然需要代码来解析命令并执行它。