Программы
C получают аргументы командной строки через два аргумента для main()
, традиционно называемые argc
и argv
(для количества аргументов и вектора аргумента соответственно).
Аргументы ничего не "именуют", они просто строки.
Решение для вас может выглядеть так:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
int fileno;
/* ... your definitions should remain here, too */
if(argc > 1)
{
/* Assume first argument is filename, and open it. */
fileno = open(argv[1], O_RDONLY);
if(fileno < 0)
{
printf("Unable to open file, aborting\n");
return 1;
}
}
else
fileno = STDIN_FILENO;
/* ... your code goes here ... */
}
Тогда вам, конечно, нужно изменить вызов на Rio_readinitb()
, чтобы использовать переменную fileno
для дескриптора файла.
Если вы буквально не можете изменить эту строку по какой-то причине ... Я думаю, вы можете использовать препроцессор для того, чтобы символ получил новое имя переменной:
#undef STDIN_FILENO
#define STDIN_FILENO fileno
Это, конечно, не совсем красиво, но должно работать.
Убедитесь, что вы поставили эти макросы препроцессора после строки fileno = STDIN_FILENO;
.