2015-04-04 2 views
2

I ввод текстового файла в моей программе C помощью Перенаправление < ввода/вывода в терминале:Как повторно использовать (перемотка назад) перенаправленный файл в C

MyProgram.exe < "data.txt" 

, а затем использовать getchar() и scanf() в моем код для чтения с перенаправленного ввода. Однако, поскольку это перенаправленный файл, я не могу использовать указатель файла C для перемотки буфера.

(Я хочу подсчитать количество строк в файле произвольного размера, чтобы я мог инициализировать массив, тогда я хочу перечитать файл, используя getchar() и/или scanf()).

Как достичь перемотки или флеши при использовании перенаправленного ввода?

+0

вы не можете перемотать назад –

+0

Вы действительно попробовали перемотать его? fseek работает только на stdin, когда stdin является обычным файлом, и когда вы перенаправляетесь так, stdin является обычным файлом. –

+0

@ Lashane: Учитывая, что стандартный вход поступает из файла диска, его можно перематывать так же, как и любой другой поток файлов, подключенный к файлу диска. –

ответ

4

Однако, поскольку это перенаправленный файл, я не могу использовать указатель файла c для перемотки буфера.

Уверен, что вы можете! И это очень легко. Когда файл перенаправляется на стандартный ввод, stdin файл, так что вы можете относиться к нему так же, как и любой другой файл:

rewind(stdin); 

Но имейте в виду, что это будет работать только тогда, когда стандартный ввод перенаправляется из файл. Он не будет работать, если стандартный вход поступает от терминала или трубы (например, cat file.txt | myapp).

+0

Работал! Спасибо! – Cobes

+0

Это просто плохая идея предположить, что 'stdin' - это файл. Правильный способ - не хранить и не хранить требуемую историю. – Olaf