Input loop: Difference between revisions

From Rosetta Code
Content added Content deleted
m (Added to <5 category)
(C++ version)
Line 1: Line 1:
[[Category:Less Than 5 Examples]]{{task}}Read from a text stream either word-by-word or line-by-line until the stream runs out of data. The stream will have an unknown amount of data on it.
[[Category:Less Than 5 Examples]]{{task}}Read from a text stream either word-by-word or line-by-line until the stream runs out of data. The stream will have an unknown amount of data on it.

=={{header|C++}}==
The following functions store the words resp. lines in a vector. Of course, instead arbitrary processing of the words could be done.
#include <istream>
#include <string>
#include <vector>
// word by word
void read_words(std::istream& is, std::vector<std::string>& words)
{
std::string word;
while (is >> word)
{
// store the word in the vector
words.push_back(word);
}
}
// line by line:
void read_lines(std::istream& is, std::vector<std::string>& lines)
{
std::string line;
while (std::getline(is, line))
{
// store the line in the vector
lines.push_back(line);
}
}

An alternate way to read all words into a vector is to use iterators:

#include <istream>
#include <string>
#include <iterator>
#include <algorithm>
#include <vector>
void read_words(std::istream& is, std::vector<std::string>& words)
{
std::copy(std::istream_iterator<std::string>(is), std::istream_iterator<std::string>(),
std::back_inserter(words));
}

For arbitrary processing, replace std::copy with std::for_each or std::transform calling an appropriate function (or function object).


=={{header|Java}}==
=={{header|Java}}==

Revision as of 17:19, 22 February 2008

Task
Input loop
You are encouraged to solve this task according to the task description, using any language you may know.

Read from a text stream either word-by-word or line-by-line until the stream runs out of data. The stream will have an unknown amount of data on it.

C++

The following functions store the words resp. lines in a vector. Of course, instead arbitrary processing of the words could be done.

#include <istream>
#include <string>
#include <vector>

// word by word
void read_words(std::istream& is, std::vector<std::string>& words)
{
  std::string word;
  while (is >> word)
  {
    // store the word in the vector
    words.push_back(word);
  }
}

// line by line:
void read_lines(std::istream& is, std::vector<std::string>& lines)
{
  std::string line;
  while (std::getline(is, line))
  {
    // store the line in the vector
    lines.push_back(line);
  }
}

An alternate way to read all words into a vector is to use iterators:

#include <istream>
#include <string>
#include <iterator>
#include <algorithm>
#include <vector>

void read_words(std::istream& is, std::vector<std::string>& words)
{
  std::copy(std::istream_iterator<std::string>(is), std::istream_iterator<std::string>(),
            std::back_inserter(words));
}

For arbitrary processing, replace std::copy with std::for_each or std::transform calling an appropriate function (or function object).

Java

Some people prefer Scanner or BufferedReader, so a way with each is presented.

import java.util.Scanner;
...
Scanner in = new Scanner(System.in);//stdin
//new Scanner(new FileInputStream(filename)) for a file
//new Scanner(socket.getInputStream()) for a network stream
while(in.hasNext()){
	String input = in.next(); //in.nextLine() for line-by-line
	//process the input here
}

or

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
...
try{
	BufferedReader inp = new BufferedReader(new InputStreamReader(System.in));//stdin
	//new BufferedReader(new FileReader(filename)) for a file
	//new BufferedReader(new InputStreamReader(socket.getInputStream())) for a netowrk stream
		while(inp.ready()){
			String input = inp.readLine();//line-by-line only
			//process the input here
		}
} catch (IOException e) {
	//There was an input error
}