Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用标准输入重定向输入_C++_Sorting_Stdin - Fatal编程技术网

C++ 使用标准输入重定向输入

C++ 使用标准输入重定向输入,c++,sorting,stdin,C++,Sorting,Stdin,我正在写一个对整数数组排序的短程序。打开输入文件“prog1.d”时遇到问题。任务要求在programs目录中创建一个符号链接,在创建了object&executable之后,我们调用程序如下 prog1.exe < prog1.d &> prog1.out prog1.exeprog1.out 我知道我的冒泡排序正确有效,因为我使用了自己的测试“txt”文件 任务说: 您的程序从stdin获取随机整数并将其放入数组中,按升序对数组中的整数进行排序,然后在stdout上显

我正在写一个对整数数组排序的短程序。打开输入文件“prog1.d”时遇到问题。任务要求在programs目录中创建一个符号链接,在创建了object&executable之后,我们调用程序如下

prog1.exe < prog1.d &> prog1.out
prog1.exeprog1.out
我知道我的冒泡排序正确有效,因为我使用了自己的测试“txt”文件

任务说:

您的程序从stdin获取随机整数并将其放入数组中,按升序对数组中的整数进行排序,然后在stdout上显示数组的内容

如何使用'cin'读取文件,直到EOF&将整数添加到数组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;
}
intmain(intargc,char*argv[])
{
int a[大小];

对于(int i=1;i由于您在stdin上管道传输文件,因此argv[1]上没有文件名,只需在用户在控制台键入时读取stdin,例如使用
cin

cin.getline (...);

当您在命令行上使用重定向时,
argv
不包含重定向。相反,指定的文件只是成为您的
stdin
/
cin
。因此您不需要(也不应该尝试)显式打开它——只需从标准输入读取,就像在输入未重定向时从终端读取一样。

其他答案完全正确,但下面是要分类的重写代码:

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;
}
intmain(intargc,char*argv[])
{
int a[大小];
整数计数=0;
//读取整数并放入数组a[]
//始终检查数组的边界
对于(int i=0;i>a[i];
如果(标准::cin)
计数=计数+1;
其他的
打破
}
bubbleSort(a,count);//调用排序例程
printArr(a,count);//调用打印例程
返回0;
}

正如大家所说,直接使用
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);
}
std::向量a;
int i;
while(std::cin>>i){
a、 推回(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));
#包括
#包括
...
std::载体a;
std::copy(std::istream_迭代器(std::cin),
std::istream_迭代器(),
标准:背部插入器(a);

你的泡泡排序有效吗?这是一个矛盾。哈哈,很好。我的意思是它按预期工作。更好吗?@本杰明·林德利:在巫婆中,很少有一个实现良好的泡泡排序优于所有其他常用排序算法。@没人:你指的是鸡尾酒排序还是梳状排序?因为它们不再是泡泡排序了。@Moing Duck:不,我说的是bubblesort实现,它的平均案例复杂度为O(n²),但在quicksort和其他需要O(n log n)的特殊情况下,它可以在O(n)中运行。一种特殊情况是排序的序列,或者第二个元素与其前一个元素交换位置的序列。+1,直到您提到
get()
,应该是-1。你能给我举个例子吗?我基本上是在问如何从整个文件中读取输入,就好像他们在输入一样console@Oli修正了,我误解了是c而不是c++@bluetick,使用完全相同的代码从控制台读取。这就是I/o重定向的美妙之处:你的程序没有我甚至不知道它是从文件还是从控制台读取。@bluetick,在
read int's后面加上您已有的代码并放入数组a[]
注释。只需使用
cin
而不是
infle
。请不要鼓励使用
std::ios::eof
来测试输入结束。测试
>
表达式的bool值更容易、更可靠。请参阅或以获取
std::ios::eof
是邪恶的原因的示例。已更正。我通常会尝试更正样本的变化很小,这就是我最初离开该部分的原因。这些样本中的错误与eof无关,而与检查错误位置的流状态有关。尽管我承认这是istreams的一个非常常见的错误。我不同意。不管你把
eof()放在哪里
,您将有一个bug。请考虑:和。