2011-11-08 42 views
2

我知道这是一个非常具体的问题。我在unix机器上使用g ++编译器编译C++代码。 我有下面的一行代码来读取指定为参数C++的文本文件:相克编译后test.ccUnix上的C++读写文件

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

    ifstream inputfile(argv[1]); 

} 

现在++,我会叫它为:

./test file.txt 

但什么我应该做的,如果我想称其为

./test <file.txt 

总之我怎么使用默认的输入/输出文件中读取

+0

http:// stackoverflow。com/q/7789007/14065 –

+0

你的意思是你也想从'stdin'读取,或者代替'inputfile' –

回答

7

您应该检查参数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; 
    } 
} 

我之所以调用另一个函数读取和处理输入,是因为你不能分配数据流,但必须使用引用或指针。将单独的任务放在不同的函数中也是很好的,因为它会增加代码的可读性。

+0

Joachim,只是一个查询,所以使用上面的代码,如果我将编译后的程序运行为./ test user1035927

+2

@ user1035927是的,它应该。来吧,试试吧。 :) –

0

使用<将该文件重定向到stdin,因此您可以通过C++中的std :: cin获取它。

0

您需要改为从stdin,da文件读取。

换句话说从键盘读取。

当你插入东西时,它会像从键盘上输入一样被读取。

1

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

例如:

std::string s; 
std::getline(std::cin, s); 
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 */ 
+0

参考文件必须在施工时初始化。将它改为指针,或者用ifstream&myin =(argc> 1?* new infstream(argv [1]):cin);'(如果argc> 1,请不要忘记删除myin) –

+0

是的,这是更好的。 –

0

,您将需要修改你的例子来检查ARGC,看看是否有命令行参数传入,作为输入重定向由壳剥离,所以如果ARGC为0,那么阅读从其他示例中给出的标准中,否则将作为您的示例代码。

0

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