Перенаправление ввода с использованием стандартного ввода - PullRequest
4 голосов
/ 29 августа 2011

Я пишу короткую программу для сортировки массива целых чисел. У меня проблемы с открытием входного файла, который называется "prog1.d". Присвоение попросило создать символическую ссылку в каталоге программ, и после создания объекта и исполняемого файла мы вызываем программу следующим образом ...

prog1.exe < prog1.d &> prog1.out

Я знаю, что моя сортировка пузырьков работает правильно и эффективно, потому что я использовала свой собственный тестовый txt файл.

В задании говорится:

Ваша программа получает случайные целые числа из stdin и помещает их в массив, сортирует целые числа в массиве в порядке возрастания, а затем отображает содержимое массива на стандартный вывод.

Как мне прочитать файл с помощью '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;
}

Я знаю, что открытие потока - это неправильный способ сделать это, я просто использовал его для тестового файла 'txt', который использовал, чтобы убедиться, что моя сортировка работает. Учитель сказал, что мы должны перенаправить ввод в 'cin', как будто кто-то вводит целые числа с клавиатуры.

Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

5 голосов
/ 29 августа 2011

Когда вы используете перенаправление в командной строке, argv не содержит перенаправления. Вместо этого указанный файл просто становится вашим stdin / cin. Так что вам не нужно (и не следует пытаться) открыть его явно - просто читайте со стандартного ввода, как вы читали бы с терминала, когда ввод не перенаправлен.

3 голосов
/ 29 августа 2011

Поскольку вы отправляете файл на стандартный ввод, у вас нет имени файла в argv [1], просто прочитайте стандартный ввод, когда пользователь печатал на консоли, например, используя cin:

cin.getline (...);
2 голосов
/ 29 августа 2011

Остальные ответы полностью верны, но вот переписанный код для уточнения:

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;
}
1 голос
/ 29 августа 2011

Как все заявили, используйте std::cin напрямую - вам не нужно открывать входной файл, ваша оболочка уже сделала это для вас.

Но, пожалуйста, пожалуйста, пожалуйста,не используйте 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...