2016-10-22 19 views
2

Я немного новичок в C.Мэйна символ * ARGV [] не включает в себя аргументы, если STDIN файлов

./main 7 4 

Эта команда в терминальных причин, ARGV [1] = 7, ARGV [2 ] = 4.

./main <input.in 

При использовании перенаправления стандартного ввода в терминале, это только показывает ARGC = 1 (./ основной).

Есть ли способ решить эту проблему или мне нужно попробовать по-другому?

+2

'stdin' не совпадает с аргументами командной строки *, переданными в программу. – EOF

+1

"* Есть ли способ решить эту проблему *" Какая проблема? Вы описали четко определенное поведение, но не сказали нам, в чем проблема. – alk

+0

Для второго примера используйте любые * чтения * из 'stdin' (Standard Input), чтобы получить ваши номера. – alk

ответ

2

Вы интерпретируете <file.txt как «отправить файл file.txt в этот процесс« stdin », поэтому ваша программа никогда не увидит часть <file.txt.

Невозможно решить эту проблему, поскольку это преднамеренная функция оболочек POSIX (и, возможно, других).

0

Мы, поскольку вы находитесь на Ubuntu и используете терминал, я предполагаю, что вы используете bash. Проблема, с которой вы сталкиваетесь, не является реальной проблемой c, но как bash запускает вашу программу.

Терминальные крючки в празе ./program [args, ...] < redirected, вызов bash внутри функции exec, чтобы запустить вашу программу и настроить среду для вашей программы. Он устанавливает вашу программу с любым из аргументов между [], но после и включает символы перенаправления «<». Он не представлен вашей программе в качестве аргумента, но он перехватывает ее до стандартного ввода.

Так что, если вы хотите сделать что-то с ним вы можете сделать:

#include <stdio.h> 
int mychar = getchar(stdin). 

потому что FILE* stdin; уже открыт для него. Файл stdin в противном случае принял бы вход с клавиатуры, но теперь будет читать из файла. Вы, конечно, не ограничены getchar, вы можете взять много функций c из stdio.h, которые берут ФАЙЛ * и используют его.