Reading array of numbers from file

monarch_dodra monarchdodra at gmail.com
Fri Jan 11 05:31:36 PST 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:
>> 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.


More information about the Digitalmars-d-learn mailing list