Thread overview
reading in text files
Aug 24, 2011
Brian Brady
Aug 24, 2011
Johannes Pfau
Aug 24, 2011
Brian Brady
Aug 24, 2011
Christophe
Aug 24, 2011
Andrej Mitrovic
Aug 24, 2011
Cristi Cobzarenco
Aug 24, 2011
Jesse Phillips
August 24, 2011
All

I am working through Andrei Alexandrescus "The D Programming Language" but have hit a road block fairly early on.

There is a program in the book which is designed to read through a text file and do a simple word count. The program looks like this:

import std.stdio, std.string;

void main()
{
  //Compute counts
  uint[string] freqs;
  foreach(line; stdin.byLine())
  {
    foreach(word; split(strip(line)))
    {
      ++freqs[word.idup];
    }
  }

  //Prints count
  foreach(key, value; freqs)
  {
    writefln("%6u\t%s", value, key);
  }
}

My query is basically how to read the text file in?

currently I am trying to use
./readingHamlet cat hamlet.txt

but it just hangs there, not doing anything(for a considerable time) so I am assuming I am doing something wrong. There isn't any actual mention in the book of *how* reading in the text file should be accomplished, so what is the best way to do this?

std.file?

Seems silly providing a program that analyses a text file, without telling the reader how to read in the text file, so I am wondering if there is some assumed knowledge I am missing?

Regards.
August 24, 2011
Brian Brady wrote:
>All
>
>I am working through Andrei Alexandrescus "The D Programming Language" but have hit a road block fairly early on.
>
>There is a program in the book which is designed to read through a text file and do a simple word count. The program looks like this:
>
>import std.stdio, std.string;
>
>void main()
>{
>  //Compute counts
>  uint[string] freqs;
>  foreach(line; stdin.byLine())
>  {
>    foreach(word; split(strip(line)))
>    {
>      ++freqs[word.idup];
>    }
>  }
>
>  //Prints count
>  foreach(key, value; freqs)
>  {
>    writefln("%6u\t%s", value, key);
>  }
>}
>
>My query is basically how to read the text file in?
>
>currently I am trying to use
>./readingHamlet cat hamlet.txt
>
>but it just hangs there, not doing anything(for a considerable time) so I am assuming I am doing something wrong. There isn't any actual mention in the book of *how* reading in the text file should be accomplished, so what is the best way to do this?
>
>std.file?
>
>Seems silly providing a program that analyses a text file, without telling the reader how to read in the text file, so I am wondering if there is some assumed knowledge I am missing?
>
>Regards.

Hi,
stdin.byLine() reads from the standard input, which is your
console/keyboard input by default. The default stdin doesn't have an
end, and unless you type something in, there's no input at all. That's
why the program just hangs.

On Linux/unix you can for example pipe the output from one command to another:

cat hamlet.txt | ./readingHamlet

this way readingHamlet's standard input is connected to cat's standard output.

-- 
Johannes Pfau

August 24, 2011
On Wed, 24 Aug 2011 10:25:18 -0400, Johannes Pfau <spam@example.com> wrote:

> On Linux/unix you can for example pipe the output from one command to
> another:
>
> cat hamlet.txt | ./readingHamlet
>
> this way readingHamlet's standard input is connected to cat's standard
> output.

I believe in all OSes (Windows included) ./readingHamlet < hamlet.txt works.

Could be wrong though.

-Steve
August 24, 2011
== Quote from Johannes Pfau (spam@example.com)'s article
> Brian Brady wrote:
> >All
> >
> >I am working through Andrei Alexandrescus "The D Programming Language" but have hit a road block fairly early on.
> >
> >There is a program in the book which is designed to read through a text file and do a simple word count. The program looks like this:
> >
> >import std.stdio, std.string;
> >
> >void main()
> >{
> >  //Compute counts
> >  uint[string] freqs;
> >  foreach(line; stdin.byLine())
> >  {
> >    foreach(word; split(strip(line)))
> >    {
> >      ++freqs[word.idup];
> >    }
> >  }
> >
> >  //Prints count
> >  foreach(key, value; freqs)
> >  {
> >    writefln("%6u\t%s", value, key);
> >  }
> >}
> >
> >My query is basically how to read the text file in?
> >
> >currently I am trying to use
> >./readingHamlet cat hamlet.txt
> >
> >but it just hangs there, not doing anything(for a considerable time) so I am assuming I am doing something wrong. There isn't any actual mention in the book of *how* reading in the text file should be accomplished, so what is the best way to do this?
> >
> >std.file?
> >
> >Seems silly providing a program that analyses a text file, without telling the reader how to read in the text file, so I am wondering if there is some assumed knowledge I am missing?
> >
> >Regards.
> Hi,
> stdin.byLine() reads from the standard input, which is your
> console/keyboard input by default. The default stdin doesn't have an
> end, and unless you type something in, there's no input at all. That's
> why the program just hangs.
> On Linux/unix you can for example pipe the output from one command to
> another:
> cat hamlet.txt | ./readingHamlet
> this way readingHamlet's standard input is connected to cat's standard
> output.

This worked!! As I assumed, it was something simple :S

Thank you so much.
August 24, 2011
Maybe ./readingHamlet < hamlet.txt
August 24, 2011
> The default stdin doesn't have an end, and unless you type something in, there's no input at all. That's why the program just hangs.

You can end keyboard stdin by typing ^D (Ctrl + D) under unix.
August 24, 2011
The program reads the "file" from stdin, so you need to redirect stdin to the file you want: try "./readingHamlet < hamlet.txt" or "cat hamlet.txt | ./readingHamlet" without the quotes on a *NIX system.

---
Cristi Cobzarenco
BSc in Artificial Intelligence and Computer Science
University of Edinburgh
Profile: http://www.google.com/profiles/cristi.cobzarenco



On 24 August 2011 17:01, Brian Brady <brian.brady1982@gmail.com> wrote:
> All
>
> I am working through Andrei Alexandrescus "The D Programming Language" but have hit a road block fairly early on.
>
> There is a program in the book which is designed to read through a text file and do a simple word count. The program looks like this:
>
> import std.stdio, std.string;
>
> void main()
> {
>  //Compute counts
>  uint[string] freqs;
>  foreach(line; stdin.byLine())
>  {
>    foreach(word; split(strip(line)))
>    {
>      ++freqs[word.idup];
>    }
>  }
>
>  //Prints count
>  foreach(key, value; freqs)
>  {
>    writefln("%6u\t%s", value, key);
>  }
> }
>
> My query is basically how to read the text file in?
>
> currently I am trying to use
> ./readingHamlet cat hamlet.txt
>
> but it just hangs there, not doing anything(for a considerable time) so I am assuming I am doing something wrong. There isn't any actual mention in the book of *how* reading in the text file should be accomplished, so what is the best way to do this?
>
> std.file?
>
> Seems silly providing a program that analyses a text file, without telling the reader how to read in the text file, so I am wondering if there is some assumed knowledge I am missing?
>
> Regards.
>
August 24, 2011
Brian Brady Wrote:

> but it just hangs there, not doing anything(for a considerable time) so I am assuming I am doing something wrong. There isn't any actual mention in the book of *how* reading in the text file should be accomplished, so what is the best way to do this?

Now that you know how to use the program, here is the answer to your question.

auto content = std.file.readText("filename");

There are other functions depending on use case but this is most common.