Трябва ли да променя stdin, ако първоначално използвам 'filename' като stdin и след това трябва да се върна към традиционния конзолен stdin?

./dataset ‹ име на файл

// Прочитам данните във файл и ги съхранявам в масиви...

...

// Тук трябва да попитам потребителя за номер, но програмата винаги пропуска въвеждането от потребителя и продължава...

char отговор; отговор = getchar(); // Винаги пропускайте getchar()


person user3366297    schedule 03.03.2014    source източник


Отговори (2)


Не, това не е начинът да го направим. Нямам представа дали ще работи, но не би ли било много по-лесно просто да отворите файла, да го прочетете и да запазите stdin за вашето взаимодействие с потребителя?

FILE *yourinputfile;

yourinputfile=fopen("whatevernamethefilehas","r");
// read with the appropriate routines, eg fscanf

fclose (yourinputfile);

char answer; answer = getchar(); // won't skip now

Ще забележите, че всички процедури за въвеждане в C имат "стенографско" разнообразие, което чете stdin, и разнообразие, което започва с f, което ще чете файл

  • scanf и fscanf
  • получава и fgets
  • и т.н

Човешките страници са твой приятел :)

person fvu    schedule 03.03.2014
comment
Да, това би било по-лесно, но учителите обичат да го правят сложно... Разбирам това, което предложихте, просто не мога да го направя така... Трябва да пренасоча файла по този начин ./dataset ‹ име на файл и след това вземете информация от потребителя... - person user3366297; 04.03.2014
comment
Тук има няколко свързани въпроса в SO, като stackoverflow.com/questions/584868/ може би това ще помогне? Все пак не мисля, че това е добра идея, но ако това е, което проф. иска, е, нямате много избор... - person fvu; 04.03.2014

Ако ви е разрешено да използвате паралелност, можете да fork() нов процес и dup2() stdin към нов файлов дескриптор във вашия дъщерен процес. Искате да сте сигурни, че няма да дублирате2() вашия stdin на вашия основен процес или в противен случай ще загубите способността да четете от stdin.

Ще се радвам да навляза в повече подробности, ако това изглежда като правилната подробност за посоката

Редактиране: Можете ли да споделите как сте "спряли" да четете от традиционния stdin? Объркан съм, защото обикновено четенето от файл не трябва да ви спира да можете да четете от stdin.

Edit2 - Мисля, че fvu е прав, ако погледнете страницата, която сте свързали с вас, има отговор, който говори за използване на dup2() за копиране на файловия дескриптор на stdin във временен файлов дескриптор, заменете файловия дескриптор за stdin с нещо друго и след това го заменете отново с временното му копие. Това звучи като това, което търсите

person MoMo    schedule 03.03.2014
comment
Не съм сигурен дали fork() ще свърши работа... Не се опитвам да дублирам процеса, просто за да спра да чета от 'filename' и да започна да чета отново от 'traditional' stdin - person user3366297; 04.03.2014