digitalmars.D.learn - hackish writefln? and
- david (26/26) Apr 28 2007 Hello all!
- david (13/47) Apr 28 2007 Just confirmed:
- Frits van Bommel (11/41) Apr 28 2007 That's a different matter entirely. String arguments to writef and
- david (6/52) Apr 28 2007 Thanks a lot for the explanation, now it is clear (and works).
Hello all! Is writefln( (i<10?" ":"") ~ "%d: %s", i, v); supposed to work, according to the specs? Just looked at them, but couldn't quiet get it. But nevertheless it *does* work, no compile/runtime error and it acts also in the expected way. BUT: I just came back from hunting (bugs), and you get an error if you write the above code in a file, read it in using std.file & std.stream, and writefln it back to the console: *** bugtest.txt writefln( (i<10?" ":"") ~ "%d: %s", i, v); *** bugtest.d import std.file, std.stream, std.stdio; void main() { File file = new File; file.open("bugtest.txt"); char[] line; line = file.readLine(); file.close(); writefln(line); // here we get an error } david
Apr 28 2007
david schrieb:Hello all! Is writefln( (i<10?" ":"") ~ "%d: %s", i, v); supposed to work, according to the specs? Just looked at them, but couldn't quiet get it. But nevertheless it *does* work, no compile/runtime error and it acts also in the expected way. BUT: I just came back from hunting (bugs), and you get an error if you write the above code in a file, read it in using std.file & std.stream, and writefln it back to the console: *** bugtest.txt writefln( (i<10?" ":"") ~ "%d: %s", i, v); *** bugtest.d import std.file, std.stream, std.stdio; void main() { File file = new File; file.open("bugtest.txt"); char[] line; line = file.readLine(); file.close(); writefln(line); // here we get an error } davidJust confirmed: *** bug.d import std.stdio; void main() { char[] line; line = "writefln( (i<10?\" \":\"\") ~ \"%d: %s\", i, v);"; writefln(line); // here we get an error } It compiles just fine, so the string should be ok, BUT at runtime: Error: std.formatwritefln( (i<10?" ":"") ~ " david
Apr 28 2007
david wrote:Hello all! Is writefln( (i<10?" ":"") ~ "%d: %s", i, v); supposed to work, according to the specs? Just looked at them, but couldn't quiet get it.Yes, that should be fine (assuming i is some form of integer).But nevertheless it *does* work, no compile/runtime error and it acts also in the expected way. BUT: I just came back from hunting (bugs), and you get an error if you write the above code in a file, read it in using std.file & std.stream, and writefln it back to the console: *** bugtest.txt writefln( (i<10?" ":"") ~ "%d: %s", i, v); *** bugtest.d import std.file, std.stream, std.stdio; void main() { File file = new File; file.open("bugtest.txt"); char[] line; line = file.readLine(); file.close(); writefln(line); // here we get an error }That's a different matter entirely. String arguments to writef and friends are by default treated as format strings. Since the string you provide contains %d and %s, it expects two additional arguments. Since none are provided it throws an exception. Change the last line to --- writefln("%s", line); --- to write out the exact contents of the string. Stuff like this is why we *really* need non-formatting write functions :(...
Apr 28 2007
Frits van Bommel schrieb:david wrote:Thanks a lot for the explanation, now it is clear (and works). Althoug I guess this could pose a risk for bugs in other people's code, since the code itself works and the bug only pops up on very special input data occasions. (glad I'm enlightened now ^_^) davidHello all! Is writefln( (i<10?" ":"") ~ "%d: %s", i, v); supposed to work, according to the specs? Just looked at them, but couldn't quiet get it.Yes, that should be fine (assuming i is some form of integer).But nevertheless it *does* work, no compile/runtime error and it acts also in the expected way. BUT: I just came back from hunting (bugs), and you get an error if you write the above code in a file, read it in using std.file & std.stream, and writefln it back to the console: *** bugtest.txt writefln( (i<10?" ":"") ~ "%d: %s", i, v); *** bugtest.d import std.file, std.stream, std.stdio; void main() { File file = new File; file.open("bugtest.txt"); char[] line; line = file.readLine(); file.close(); writefln(line); // here we get an error }That's a different matter entirely. String arguments to writef and friends are by default treated as format strings. Since the string you provide contains %d and %s, it expects two additional arguments. Since none are provided it throws an exception. Change the last line to --- writefln("%s", line); --- to write out the exact contents of the string. Stuff like this is why we *really* need non-formatting write functions :(...
Apr 28 2007