www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Reading array of numbers from file

reply Lubos Pintes <lubos.pintes gmail.com> writes:
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
parent reply "evilrat" <evilrat666 gmail.com> writes:
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
next sibling parent "evilrat" <evilrat666 gmail.com> writes:
oops, for reading by line it is not std.file.byLine but 
std.stdio.File.byLine

http://dlang.org/phobos/std_stdio.html#.File.byLine

well, use docs, there are lot of info for starters
Jan 11 2013
prev sibling parent "monarch_dodra" <monarchdodra gmail.com> writes:
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:
 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; } }
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.
Jan 11 2013