在Unix系统上使用C++读写文件

3

我知道这是一个非常具体的问题。我在Unix机器上使用g++编译器编译C ++代码。以下是用于读取指定为C ++参数的文本文件的一行代码:test.cc

int main(int argc, char *argv[])
{

    ifstream inputfile(argv[1]);

}

现在,使用g++编译后,我将这样调用它:
./test file.txt

但是如果我想称呼它为什么应该怎么做呢?

./test <file.txt

简单来说,如何使用默认的输入/输出进行文件读取?


https://dev59.com/fFzUa4cB1Zd3GeqP10kB - Martin York
你的意思是要从stdin读取,还是代替inputfile - Mooing Duck
9个回答

8

您应该检查main函数的参数,以查看程序是否有传入参数。如果有,则可以将其用作文件名,否则使用std::cin

以下是一个示例:

void do_something(istream &input)
{
    // Read some stuff from the input
}

int main(int argc, char *argv[])
{
    if (argc == 1)
        do_something(cin);
    else if (argc == 2)
        do_something(ifstream(argv[1]));
    else
    {
        cout << "Error: Must supply a file\n";
        return 1;
    }
}

我之所以调用另一个函数来读取和处理输入,是因为你无法分配流,而必须使用引用或指针。此外,将不同的任务放在不同的函数中也是很好的选择,这可以提高代码的可读性。


Joachim,只是一个问题,那么使用上面的代码,如果我将编译后的程序作为./test <file.txt运行,它会将文件的内容传递给do_something istream吗? - user1035927
2
@user1035927 是的,应该可以。请试一下吧。 :) - Some programmer dude

1

当你想从标准输入读取时,使用std::cin而不是打开自己的流。

例如:

std::string s;
std::getline(std::cin, s);

0

使用 < 将文件重定向到 stdin,因此您可以通过 c++ 中的 std::cin 访问它。


0

你需要从标准输入(stdin)中读取,而不是文件。

换句话说,从键盘读取。

当你通过管道输入内容时,它将被视为从键盘输入的内容。


0

你可以做到大多数Unix命令所做的事情:如果指定了文件名,则从文件中读取。如果文件名缺失,则从标准输入读取。


0

cin对象已经在iostream中定义。请直接从cin读取,而不是从inputfile


0

也许

ifstream &myin;
if (argc>1) {
   ifstream* inputfilep = new infstream(argv[1]);
   myin = *inputfile;
}
else myin = cin;
/* do your input on myin */

引用必须在构造函数中初始化。将其改为指针,或使用条件语句 ifstream &myin = (argc>1?*new infstream(argv[1]):cin); 进行初始化(如果 argc>1,请勿忘记删除 myin!) - Mooing Duck

0

你需要修改你的示例代码,检查 argc 是否有任何命令行参数传入,因为输入重定向被 shell 剥离了,所以如果 argc 为 0,则从标准输入读取,就像其他示例一样;否则按照你的示例代码处理。


0

你不需要做任何事情。 只需编写程序,就好像你正在从命令行读取一样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接