
Это отформатированная программа на языке C, которая называется fahr_kel:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include <vector>
int main( int argc, char *argv[] )
{
if (argc < 3)
{
std::cerr << "Usage:" << argv[0] << " arg1 arg2 \n"
<< "arg1 is the conversion type (1 or 2) \n "
<< "arg 2 is the temp to be converted" << std::endl;
return 1;
}
// Assign the variables used in this program
int temp, conv_temp, conv_type;
// assign the input options to variables
conv_type=atoi(argv[1]);
temp=atoi(argv[2]);
// convert the temps..
// if the input number is 1, convert from Kelvin to Fahrenheit
// if the input number is anything else, convert from Fahrenheit to Kelvin
if (conv_type == 1)
conv_temp = (((temp - 273) * 1.8) + 32);
else
conv_temp = (((( temp - 32 ) * 5 ) / 9 ) + 273 );
// print the data
printf (" %3.1i %3.1i\n",temp,conv_temp);
// end of main function
return 0;
}
Мне нужно управлять этой программой с помощью пользовательского ввода в моем bash-скрипте.
Это файл данных, который мне нужно передать через программу на языке C под названием project3.data:
0
32
100
212
108
1243
3000
85
22
2388
235
Это скрипт, который я создал и назвал project3.bash.
#!/bin/bash
echo -n "Convert from kelvin to fahrenheit(1) or fahreinheit to kelvin(2)"
read choice
/home/username/project3/fahr_kel [ choice project3.data ]
Я получаю только первую строку для вывода скрипта. 0 и 256
Вывод должен выглядеть примерно так:
---------------------- -----------------------
Fahrenheit Temperature Kelvin Temperature
--------------------- -----------------------
0 256
--------------------- -----------------------
32 273
---------------------- -----------------------
100 310
---------------------- -----------------------
212 373
---------------------- -----------------------
108 315
---------------------- -----------------------
1243 945
---------------------- -----------------------
3000 1921
---------------------- -----------------------
85 302
---------------------- -----------------------
22 268
---------------------- -----------------------
2388 1581
---------------------- -----------------------
235 385
---------------------- -----------------------
решение1
Ваша программа C++ преобразует температуру по желанию и ожидает значение температуры в качестве второго входного аргумента. Однако ваш скрипт bash не передает температуру в качестве входного аргумента. Вместо этого он вызывает программу C++ симя файла данных как входной аргумент. Это нежелательно. Вам следует вызвать программу C++, используя сами входные значения в качестве аргумента; т. е. вам необходимо изменить скрипт bash следующим образом.
Необходимое исправление в скрипте bash — вызвать функцию c один раз для каждой строки данных и добавить необходимое форматирование. Я показываю это ниже.
#!/bin/bash
inputFile="project3.data"
echo -n "Convert from kelvin to fahrenheit(1) or fahreinheit to kelvin(2)"
read choice
# run the following per input data line
#./fahr_kel [ choice project3.data ]
cmd="./fahr_kel $choice "
# print header
linePrint="------------------ ----------------"
echo $linePrint
echo "Fahrenheit Temperature Kelvin Temperature"
echo $linePrint
while read inputVal
do
$cmd $inputVal
echo $linePrint
done < "$inputFile"
echo $linePrint
Другой способ — изменить программу на C++ так, чтобы она ожидала ввода файла вместо ввода температуры.