digitalmars.D.learn - regading detection of stdin
- Hugo Florentino (36/36) Dec 05 2013 Hi,
- Adam D. Ruppe (3/5) Dec 05 2013 Does it freeze or just wait for you to press enter on the
- Hugo Florentino (11/24) Dec 07 2013 Hmm... I am not too clear even after reading the documentation. From
- Adam D. Ruppe (7/7) Dec 07 2013 Sounds like what you need is to see if stdin is a tty.
- Chris Cain (22/29) Dec 07 2013 I'm not sure I understand the problem. Your program works as I
Hi,
I was trying to do something like this (using dmd.2.064.2 both from
Windows and Linux), but if nothing is passed from stdin and no parameter
is provided, the application freezes:
import std.stdio, std.file: readText;
int main(string[] args) {
string s;
switch (args.length) {
case 1:
if ((s = stdin.readln()) is null)
writeln("No argument passed as parameter or from stdin.");
else
writeln("Argument passed from stdin succesfully stored in
variable s.");
scope (failure) {
writeln("Error reading from stdin.");
return -1;
}
break;
case 2:
s = readText(args[1]);
scope (failure) {
writeln("Error reading from file passed as parameter.");
return -2;
}
writeln("Argument passed as parameter succesfully stored in
variable s.");
break;
default:
writeln("Incorrect number of parameters. Maximum is one.");
return -3;
}
return 0;
}
Where is the problem?
Regards, Hugo
Dec 05 2013
On Friday, 6 December 2013 at 00:24:22 UTC, Hugo Florentino wrote:if nothing is passed from stdin and no parameter is provided, the application freezes:Does it freeze or just wait for you to press enter on the keyboard?
Dec 05 2013
On Fri, 06 Dec 2013 06:42:01 +0100, Jesse Phillips" wrote:On Friday, 6 December 2013 at 02:41:28 UTC, Hugo Florentino wrote:Hmm... I am not too clear even after reading the documentation. From what I could understand, these are all wrappers around spawnProcess and spawnShell, which are intended to launch a child process from the application, but that is not quite what I need. I simply want to support this kind of use: echo -n "This is just a test" | myapplication The command echo here serves only as an example, it could be any other command not necessarily open-source or programmed in D. What can I do? Regards, HugoI see... so the "problem" simply was that function readln was expecting user input. In that case, this is not what I intended. I want the application to receive the stdout of another command as stdin, and to detect if nothing is sent. How coud I accomplish this?Then you'll want std.process[1]. This provides functions for "piping" output[2]. As for detecting output, that can only be verified once the other process has finished; to handle that it should be reasonable to execute[3] and check the complete output. 1. http://dlang.org/phobos/std_process.html
Dec 07 2013
Sounds like what you need is to see if stdin is a tty.
import core.sys.posix.unistd; // has isatty()
void main() {
import std.stdio;
writeln(isatty(0)); // 0 is stdin, so this will show 1 if
keyboard or 0 if pope
}
Dec 07 2013
On Friday, 6 December 2013 at 00:24:22 UTC, Hugo Florentino wrote:Hi, I was trying to do something like this (using dmd.2.064.2 both from Windows and Linux), but if nothing is passed from stdin and no parameter is provided, the application freezes: ...snip... Where is the problem? Regards, HugoI'm not sure I understand the problem. Your program works as I think you describe it should on my Linux box: --- zshazz manjarox ~/projects/explore % cat /dev/null | rdmd inputStuff.d No argument passed as parameter or from stdin. zshazz manjarox ~/projects/explore % echo -n "" | rdmd inputStuff.d No argument passed as parameter or from stdin. zshazz manjarox ~/projects/explore % echo -n "test" | rdmd inputStuff.d Argument passed from stdin succesfully stored in variable s. zshazz manjarox ~/projects/explore % rdmd inputStuff.d blah.txt Argument passed as parameter succesfully stored in variable s. --- If you just run it (via `rdmd inputStuff.d`) it pauses and waits for some sort of input, but that's expected. Using `ctrl-d` results in "No argument passed as parameter or from stdin." as expected in that case. Could you describe what you're doing exactly that causes it to freeze?
Dec 07 2013









"Adam D. Ruppe" <destructionator gmail.com> 