Хотя есть простой способ использования как файла Перенаправление и трубопроводов, а также интерактивный пользовательский ввод, чтение, с основной(), как показано в этом коде C сниппета ...unix: main() интерактивный, командная строка, трубопровод и перенаправление в C?
#define SIZ 1024
#include <stdio.h>
extern void do_something_with_the_array(float *a[], int *n);
int main(int argc, const char * argv[])
{
float f[SIZ];
int k = 0;
while ((scanf("%f", &f[k]) == 1)&&(k < SIZ)) {
k++;
}
do_something_with_the_array(f, k);
return 0;
}
... Я не уверен, если есть современный источник UNIX совместим и простой способ программно достижения любой из трех возможностей в main()
в C, в зависимости от контекста?
- интерактивное чтение строки чисел в качестве входных данных пользователя
- чтение той же строки чисел в качестве аргументов командной строки
- перенаправления файлов и трубопроводов
Я понимаю, что трубопроводы и перенаправление «принадлежит» оболочке, которая перехватывает программу, прежде чем она даже начнет выполнение, в то время как аргументы командной строки и интерактивное чтение «принадлежат» к main() сам, и поэтому может быть нелегкий способ сделать это.
Я вижу, используя или стандартный ввод файла входа или труб входа довольно очевидно. Однако чтение аргументов командной строки - это совсем другая история. Вот демо, как я обычно его кодирую, но он выглядит тяжело и взломан для меня. Кроме того, в более сложных сценариях с вариантами это может стать довольно грязным фрагментом кода. Я также не знаю, насколько это безупречное или безупречное доказательство ...
#define SIZ 1024
#include <stdio.h>
#include <stdlib.h>
extern void do_something_with_the_array(float *, int);
int main(int argc, const char * argv[])
{
float f[SIZ];
int k = 0;
if(argc > 2){
for(k = 0; k < argc - 1; k++)
f[k] = (float)atof(argv[k+1]);
}
else while ((scanf("%f", &f[k]) == 1)&&(k < SIZ))
k++;
do_something_with_the_array(f, k);
return 0;
}
Заранее благодарен!
Обрезанные вы, возможно, потенциально могут переполняться. – Leandros
Почему это невозможно? Просто напишите оператор switch для обработки трех условий. –
Программа обычно не знает, относится ли 'stdin' к терминальной консоли, к файлу, сокету или любому другому потоку, о котором вы могли бы подумать. – EOF