我正在编写一个简短的程序来对整数数组进行排序。我无法打开输入文件“prog1.d”。分配要求在程序目录中创建一个符号链接,并在创建对象&可执行文件,我们按如下方式调用程序......
prog1.exe < prog1.d &> prog1.out
我知道我的冒泡排序正常工作&amp;因为我使用了自己的测试'txt'文件。
作业说:
你的程序从stdin中获取随机整数并将它们放在一个数组中,按升序对数组中的整数进行排序,然后在stdout上显示数组的内容。
如何使用'cin'读取文件,直到EOF&amp;将整数添加到我的数组a []?
到目前为止,这是我的代码:
int main( int argc, char * argv[] )
{
int a[SIZE];
for ( int i=1; i<argc; i++)
{
ifstream inFile; // declare stream
inFile.open( argv[i] ); // open file
// if file fails to open...
if( inFile.fail() )
{
cout << "The file has failed to open";
exit(-1);
}
// read int's & place into array a[]
for(int i=0; !inFile.eof(); i++)
{
inFile >> a[i];
}
inFile.close(); // close file
}
bubbleSort(a); // call sort routine
printArr(a); // call print routine
return 0;
}
我知道打开一个流是错误的方法,我只是用它来测试'txt'文件我用来确保我的排序工作。老师说我们应该将输入重定向到'cin',就像有人在键盘上输入整数一样。
非常感谢任何帮助。
答案 0 :(得分:5)
在命令行上使用重定向时,argv
不包含重定向。相反,指定的文件只会成为您的stdin
/ cin
。因此,您不需要(也不应该尝试)明确地打开它 - 只需从标准输入读取,就像在未重定向输入时从终端读取一样。
答案 1 :(得分:3)
由于你在stdin上管道文件,你在argv [1]上没有文件名,只需在用户在控制台输入时读取stdin,例如使用cin
:< / p>
cin.getline (...);
答案 2 :(得分:2)
其他答案完全正确,但这里是重写的代码澄清:
int main( int argc, char * argv[] )
{
int a[SIZE];
int count = 0;
// read int's & place into array a[]
//ALWAYS check the boundries of arrays
for(int i=0; i<SIZE; i++)
{
std::cin >> a[i];
if (std::cin)
count = count + 1;
else
break;
}
bubbleSort(a, count); // call sort routine
printArr(a, count); // call print routine
return 0;
}
答案 3 :(得分:1)
正如大家所说,直接使用std::cin
- 你不需要打开输入文件,你的shell已经为你完成了。
但是,请,请,请不要使用cin.eof()
进行测试,看看是否已经达到了输入的最终结果。如果您的输入有缺陷,您的程序将挂起。即使您的输入没有缺陷,您的程序也可能(但不一定)会再次运行循环。
尝试使用此循环:
int a[SIZE];
int i = 0;
while( std::cin >> a[i]) {
++i;
}
或者,使用会自动增长的std::vector
来增加健壮性:
std::vector<int> a;
int i;
while(std::cin >> i) {
a.push_back(i);
}
或者,使用通用算法:
#include <iterator>
#include <algorithm>
...
std::vector<int> a;
std::copy(std::istream_iterator<int>(std::cin),
std::istream_iterator<int>(),
std::back_inserter(a));