reading from file
Ali Çehreli via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri Dec 16 00:03:22 PST 2016
On 12/15/2016 10:47 PM, KaattuPoochi wrote:
> On Tuesday, 13 December 2016 at 21:13:26 UTC, Ali wrote:
>>
>> And extending Ali's solution you can actually get the data in
>> to a two dimentional array at compile time and have it in static
>> memory with a small adjustment:
>>
>> static immutable matrix = import("data.txt")
>> .split("\n")
>> .map!(a => a.split(",").map!(to!int).array)
>> .array;
>>
>> void main() {
>> writeln(matrix);
>> }
>
> 1. For any non-trivial matrices (with 500 lines) runs DMD 2.072.1 out of
> memory (2GB). Not sure if this is a known bug. Works fine with LDC 1.0.0.
Just to note, there are 501 arrays generated at compile. You can reduce
that number to 1 if you know the width and the height of the matrix. The
following solution reads everything into a single array and then uses it
as an int[N][]:
import std.algorithm;
import std.conv;
import std.array;
import std.stdio;
static immutable buffer = import("deneme.txt")
.splitter
.map!(a => a.splitter(',').map!(to!int))
.joiner
.array;
// Assume these are known or are calculated at compile time:
enum width = 4;
enum height = 3;
immutable int[width][] matrix;
shared static this() {
matrix = (cast(immutable(int[width])*)buffer.ptr)[0..height];
// Make sure we did not copy into matrix
assert(cast(void*)matrix.ptr == cast(void*)buffer.ptr);
}
void main() {
writeln(matrix);
}
> 2. The EOL on the last line results in an empty row in the end. Is there
> a way to overcome this?
As an added bonus, the solution above does not suffer from empty lines.
Ali
More information about the Digitalmars-d-learn
mailing list