У меня есть следующая программа (назовем ее 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 ПОСЛЕ того, как все мои аргументы были переданы . Как мне это сделать?
Путем Вы записали это, необходимо передать эти содержание из файла к программе, не самого файла (и нет никакой потребности в 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
Таким образом, существует несколько вещей, можно сделать:
cout << "Enter...
строки в коде, таким образом, единственный вывод программы - то, что входит в файл. xargs program.cc < file.txt 2> outputresult.txt
(использование 2> вместо>). Если Вы хотите cerr видимый и суд в файле, сделайте это, поскольку у Вас был он выше со всего > . cat outputresult.txt | grep Sum > tempfile && mv tempfile outputresult.txt
можно реализовать это с кодом как это:
./program.cc < file.txt | grep Sum > outputresult.txt
Этот метод требует, чтобы новые строки были записаны, однако, таким образом, необходимо было бы удостовериться что вывод он каждый в новых строках.
я лично предложил бы использовать или управление файлами в C++ или суд и взлом cerr, в зависимости от использования программы.
i
должно быть parent_child.zip
?
– LizzAlice
20 December 2016 в 21:10
Как terdon указанный уже, чтобы сделать это Вы хотите к любому перенаправлению stdin
из файла (и вызов использование программы, например. program <inputfile.txt
) или измените свою программу так, чтобы она проанализировала аргументы, переданные из командной строки (и назовите использование программы, например. program 1 2
);
В первом случае Вы хотите подавить первые два cout
s, если stdin
не подключен к терминалу, и во втором случае Вы хотите подавить первые два cout
s, например, если, скажем, недостаточно аргументов было передано из командной строки;
Говоря о первом методе, можно проверить, подключен ли дескриптор файла к терминалу с помощью 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