file io

Steven Schveighoffer schveiguy at gmail.com
Thu Sep 6 18:30:34 UTC 2018


On 9/6/18 1:07 PM, rikki cattermole wrote:
> On 07/09/2018 4:17 AM, Arun Chandrasekaran wrote:
>> On Thursday, 6 September 2018 at 16:13:42 UTC, hridyansh thakur wrote:
>>> how to read a file line by line in D
>>
>> std.stdio.File.byLine()
>>
>> Refer the doc here: https://dlang.org/library/std/stdio/file.by_line.html
>>
>> An example from the doc:
>>
>> ```
>> import std.algorithm, std.stdio, std.string;
>> // Count words in a file using ranges.
>> void main()
>> {
>>      auto file = File("file.txt"); // Open for reading
>>      const wordCount = file.byLine()            // Read lines
>>                            .map!split           // Split into words
>>                            .map!(a => a.length) // Count words per line
>>                            .sum();              // Total word count
>>      writeln(wordCount);
>> }
>> ```
> 
> Ranges will be far too advanced of a topic to bring up at this stage.
> 
> So something a little more conventional might be a better option:
> 
> ---
> import std.file : readText;
> import std.array : split;
> import std.string : strip;
> 
> string text = readText("file.txt");
> string[] onlyWords = text.split(" ");
> 
> uint countWords;
> foreach(ref word; onlyWords) {
>      word = word.strip();
>      if (word.length > 0)
>          countWords++;
> }
> ---

Ugh, don't do that, it will read the unknown-length file into RAM all at 
once.

foreach(word; File("file.txt").byLine)
{
    word = word.strip();
    if(word.length > 0) countWords++;
}

That will buffer one line at a time and achieve the same results.

-Steve


More information about the Digitalmars-d-learn mailing list