Передача содержимого файла в командной строке для программы на C ++ [дубликат]

У меня есть следующая программа (назовем ее program.cc):

int main() {
  int x, y, sum;
  std::cout << "A program which adds two integers\n";
  std::cout << "Enter 1st integer: ";
  std::cin >> x;
  std::cout << "Enter 2nd integer: ";
  std::cin >> y;
  sum = x + y;
  std::cout << "Sum is " << sum << std::endl;
  return 0;
}

В настоящее время я пишу сценарий bash, который берет файл и проталкивает его через командную строку в качестве аргументов, передаваемых этой программе cpp. Как видите, приведенная выше программа запрашивает два ввода.

Я знаю, как передать содержимое файла для использования в качестве ввода на стандартный ввод. Но как бы вы это сделали, если хотите передать содержимое файла в качестве аргументов через командную строку?

Чтобы уточнить, скажем, file.txt - это интересующий меня файл, который просто содержит два целых числа в отдельных строках.

РЕДАКТИРОВАТЬ: Я пробовал команду xargs:

       xargs program.cc < file.txt > outputresult.txt

Но в итоге печатается то, что у меня есть в cout, например:

     A program which adds two integers
     Enter 1st integer: Enter 2nd integer: Sum is 2

Мне нужно только то, что cout'ed ПОСЛЕ того, как все мои аргументы были переданы . Как мне это сделать?

1
задан 30 September 2015 в 02:30

3 ответа

Путем Вы записали это, необходимо передать эти содержание из файла к программе, не самого файла (и нет никакой потребности в xargs, между прочим). Один способ сделать, который использует перенаправление ввода :

a.out < file

, Например:

$ cat file
4 
7
$ ./a.out < file
A program which adds two integers
Enter 1st integer: Enter 2nd integer: Sum is 11

Другой способ сделать то же самое состоит в том, чтобы распечатать содержание файла и передать Вашей программе с каналом:

$ cat file | ./a.out 
A program which adds two integers
Enter 1st integer: Enter 2nd integer: Sum is 11

А намного более чистый подход, конечно, должен был бы записать Вашу программу так, чтобы это могло взять аргументы вместо того, чтобы читать стандартный вход:

./a.out 4 7

Или, запишите это так, чтобы это могло открыть файлы внутренне и проанализировать их для его входных данных:

./a.out file

Так или иначе, для получения только последней строки в выводе, распечатайте остальных к стандартной погрешности:

#include <iostream>

int main() {
  int x, y, sum;
  std::cerr << "A program which adds two integers\n";
  std::cerr << "Enter 1st integer: ";
  std::cin >> x;
  std::cerr << "Enter 2nd integer: ";
  std::cin >> y;
  std::cerr << "\n";
  sum = x + y;
  std::cout << "Sum is " << sum << std::endl;
  return 0;
}

Теперь, выполненный:

$ ./a.out < file > output.txt
A program which adds two integers
Enter 1st integer: Enter 2nd integer: 
$ cat output.txt
Sum is 11

Или, для предоставления значений вручную:

$ ./a.out > output.txt 
A program which adds two integers
Enter 1st integer: 4
Enter 2nd integer: 7

$ cat output.txt 
Sum is 11
0
ответ дан 30 September 2015 в 12:30
  • 1
    Хорошо, let' s повторная попытка. Во-первых, выполните все команды как выше. Также создайте файл ' vbox.conf' в/etc/modules-load.d. Во-вторых, откройте vbox.conf файл с текстовым редактором и записью: vboxdrv vboxnetadp vboxnetflt vboxpci (один в каждой строке, that' s 4 строки). Сохраните и выйдите. В-третьих, перезагрузка. Надежда это будет работать теперь. – Arijit Chatterjee 21 December 2016 в 04:41

Таким образом, существует несколько вещей, можно сделать:

  1. можно произвести в файл в C++ с помощью чего-то как это .
  2. можно удалить эти cout << "Enter... строки в коде, таким образом, единственный вывод программы - то, что входит в файл.
  3. можно работать вокруг использования потока вывода ошибок (cerr вместо суда) и управлять выводами соответственно. Если Вы хотите видимый суд и cerr в файле, сделайте xargs program.cc < file.txt 2> outputresult.txt (использование 2> вместо>). Если Вы хотите cerr видимый и суд в файле, сделайте это, поскольку у Вас был он выше со всего > .
  4. Сохраняют вывод, как это теперь, но выполняет еще 2 выполнения, который удаляет нежелательные строки из Вашего кода:

cat outputresult.txt | grep Sum > tempfile && mv tempfile outputresult.txt

можно реализовать это с кодом как это:

./program.cc < file.txt | grep Sum > outputresult.txt

Этот метод требует, чтобы новые строки были записаны, однако, таким образом, необходимо было бы удостовериться что вывод он каждый в новых строках.

я лично предложил бы использовать или управление файлами в C++ или суд и взлом cerr, в зависимости от использования программы.

0
ответ дан 30 September 2015 в 12:30
  • 1
    Спасибо, это было точно, что я искал! Но я все еще don' t вполне понимают, почему это работает. где точно Вы определяли, что название i должно быть parent_child.zip? – LizzAlice 20 December 2016 в 21:10

Как terdon указанный уже, чтобы сделать это Вы хотите к любому перенаправлению stdin из файла (и вызов использование программы, например. program <inputfile.txt) или измените свою программу так, чтобы она проанализировала аргументы, переданные из командной строки (и назовите использование программы, например. program 1 2);

В первом случае Вы хотите подавить первые два couts, если stdin не подключен к терминалу, и во втором случае Вы хотите подавить первые два couts, например, если, скажем, недостаточно аргументов было передано из командной строки;

Говоря о первом методе, можно проверить, подключен ли дескриптор файла к терминалу с помощью isatty() функция (функция, определяемая POSIX в unistd.h):

int isatty(int fd);

Если fd открытый дескриптор файла, подключенный к терминалу, функция возвратится 1; Если fd не открытый дескриптор файла или не подключен к терминалу, функция возвратится 0:

#include <iostream>
#include <unistd.h>

int main() {
    int x, y, sum;
    std::cout << "A program which adds two integers\n";
    if(isatty(0)) {
        std::cout << "Enter 1st integer: ";
    }
    std::cin >> x;
    if(isatty(0)) {
        std::cout << "Enter 2nd integer: ";
    }
    std::cin >> y;
    sum = x + y;
    std::cout << "Sum is " << sum << std::endl;
    return 0;
}

Таким образом, пользователю предложат вставить числа только если stdin не был перенаправлен:

user@user-X550CL ~/tmp % ./a.out               
A program which adds two integers
Enter 1st integer: 1
Enter 2nd integer: 2
Sum is 3
user@user-X550CL ~/tmp % cat inputfile.txt 
3
4
user@user-X550CL ~/tmp % ./a.out <inputfile.txt 
A program which adds two integers
Sum is 7

Разговор о втором методе, вот очень грубый пример о том, как проанализировать аргументы, переданные из командной строки (аргументы, переданные из командной строки, хранятся в argv, который является массивом указателей на символ, таким образом, Вы должны будете бросить каждый аргумент целому числу, но не используете atoi()! Использование что-то, что позволяет Вам проверять, являются ли аргументы числовыми или нет. Я использовал atoi() только ради простоты):

#include <iostream>
#include <cstdlib>

int main(int argc, char *argv[]) {
    int x, y, sum;
    std::cout << "A program which adds two integers\n";
    if(argc == 3) {
        x = atoi(argv[1]);
        y = atoi(argv[2]);
    }
    else {
        std::cout << "Enter 1st integer: ";
        std::cin >> x;
        std::cout << "Enter 2nd integer: ";
        std::cin >> y;
    }
    sum = x + y;
    std::cout << "Sum is " << sum << std::endl;
    return 0;
}

Таким образом, пользователю предложат вставить числа, только если недостаточно аргументов было передано из командной строки:

user@user-X550CL ~/tmp % ./a.out
A program which adds two integers      
Enter 1st integer: 1
Enter 2nd integer: 2
Sum is 3
user@user-X550CL ~/tmp % ./a.out 3
A program which adds two integers
Enter 1st integer: ^C
user@user-X550CL ~/tmp % ./a.out 3 4
A program which adds two integers
Sum is 7
1
ответ дан 30 September 2015 в 12:30
  • 1
    Каждый раз, когда я включаю свой ноутбук на первом разе, когда это загружает черный экран тогда, я удалю батарею на втором разе, когда ноутбук производит звук входа в систему, но никакой дисплей и снова я удаляю свою батарею только на третьем разе только экранная начальная загрузка для входа в систему экрана – joshua 23 December 2016 в 06:09

Другие вопросы по тегам:

Похожие вопросы: