digitalmars.D.learn - Reading array of numbers from file
- Lubos Pintes (9/9) Jan 11 2013 Hi,
- evilrat (22/31) Jan 11 2013 what is the definition of format of "array" to read from file?
- evilrat (4/4) Jan 11 2013 oops, for reading by line it is not std.file.byLine but
- monarch_dodra (47/79) Jan 11 2013 Brrr....
Hi, Do I correctly suppose this is not possible? Because I don't understand fully the compiler error. import std.stdio; void main() { int[] a; stdin.readf(" %s",&a); writeln(a); }
Jan 11 2013
On Friday, 11 January 2013 at 09:44:31 UTC, Lubos Pintes wrote:Hi, Do I correctly suppose this is not possible? Because I don't understand fully the compiler error. import std.stdio; void main() { int[] a; stdin.readf(" %s",&a); writeln(a); }what is the definition of format of "array" to read from file? from your example it is reading formatted(%s = simply any string terminated by enter, also prepended by a space?) from standard input. try something like this import std.file, std.ascii; void read() { // reads whole file to string, use std.file.byLine or others on large files auto data = cast(string) read("path_to_file"); // array storing your data int[] numbers; // run through the all content readed from file foreach(ch; data) { // if character is a number put it to numbers array if ( std.ascii.isNumber(ch) ) numbers ~= cast(int) ch; } }
Jan 11 2013
oops, for reading by line it is not std.file.byLine but std.stdio.File.byLine well, use docs, there are lot of info for starters
Jan 11 2013
On Friday, 11 January 2013 at 12:17:32 UTC, evilrat wrote:On Friday, 11 January 2013 at 09:44:31 UTC, Lubos Pintes wrote:Brrr.... Don't parse data yourself! Your code, for example, will only parse digits single digits, and will parse "25" as [2, 5]... Use conv.to ! If your input is an actual array format, you can simply do this: //---- import std.stdio; import std.conv; import std.string; void main() { auto file = File("data.txt", "r"); foreach (line; file.byLine()) { auto numbers = to!(int[])(line.strip()); writeln(numbers); } } //---- Here is another approach, that will split your input into strings that only contains digits, and as such, can be parsed: //---- import std.stdio; import std.conv; import std.algorithm; import std.array; import std.ascii; void main() { auto app = appender!(int[])(); auto file = File("data.txt", "r"); foreach (line; file.byLine()) { auto stringEntries = std.algorithm.splitter!"!std.ascii.isDigit(a)"(line); auto numberEntries = stringEntries.filter!"!a.empty"().map!"to!int(a)"(); app.put(numberEntries); } writeln(app.data); } //---- Even this approach is kind of hackish though, and will not support numbers in hex format for example, or floats either. But that's the best you get for a completely generic parser that has no information on format what so ever.Hi, Do I correctly suppose this is not possible? Because I don't understand fully the compiler error. import std.stdio; void main() { int[] a; stdin.readf(" %s",&a); writeln(a); }what is the definition of format of "array" to read from file? from your example it is reading formatted(%s = simply any string terminated by enter, also prepended by a space?) from standard input. try something like this import std.file, std.ascii; void read() { // reads whole file to string, use std.file.byLine or others on large files auto data = cast(string) read("path_to_file"); // array storing your data int[] numbers; // run through the all content readed from file foreach(ch; data) { // if character is a number put it to numbers array if ( std.ascii.isNumber(ch) ) numbers ~= cast(int) ch; } }
Jan 11 2013