2014年5月14日水曜日

開発環境

C++実践プログラミング (スティーブ オウアルライン (著)、Steve Oualline (原著)、Steve Oualline(原著)、望月 康司(翻訳)、クイープ(翻訳) 、オライリー・ジャパン)のⅤ部(言語のその他の機能)の25章(STL(Standard Template Library))、25.8(プログラミング実習)、実習 25-2.を解いてみる。

その他参考書籍

実習 25-2.

コード(BBEdit, Emacs)

index.cpp

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <set>
#include <map>
#include <algorithm>

static std::ifstream in_file;
static std::ofstream out_file;
static std::map<std::string, std::set<int> > map_index;
static void write_num(const int n)
{
  out_file << n << ' ';
}

static void write_word(const std::string word)
{
  out_file << word << ' ';
  std::map<std::string, std::set<int> >::const_iterator index_loc;
  index_loc = map_index.find(word);
  std::set<int> set_num = index_loc->second;
  std::for_each(set_num.begin(), set_num.end(), write_num);
  out_file << '\n';
}

int main(int argc, char *argv[])
{
  int n;
  std::string word;
  std::set<std::string> set_word;
  std::map<std::string, std::set<int> >::const_iterator index_loc;
  
  if (argc != 3) {
    std::cerr << "Usage: <filename> <filename>\n";
    exit (8);
  }
  
  in_file.open(argv[1]);
  if (in_file.fail()) {
    std::cerr << "Unable to open " << argv[1] << '\n';
    exit (8);
  }

  while (!in_file.eof()) {
    in_file >> n;
    in_file >> word;
    set_word.insert(word);
    index_loc = map_index.find(word);
    if (index_loc == map_index.end()) {
      std::set<int> set_num;
      set_num.insert(n);
      map_index.insert(std::pair<std::string, std::set<int> >(word, set_num));
    }
    else {
      std::set<int> set_num = index_loc->second;
      set_num.insert(n);
      map_index.erase(word);
      map_index.insert(std::pair<std::string, std::set<int> >(word, set_num));
    }
  }
  
  in_file.close();
  out_file.open(argv[2]);
  if (out_file.fail()) {
    std::cerr << "Unable to open " << argv[2] << '\n';
    exit (8);
  }
  
  std::for_each(set_word.begin(), set_word.end(), write_word);
  out_file.close();
  
  return (0);
}

Makefile

CC=g++
CFLAGS=-g -Wall
SRC=index.cpp
OBJ=index.o

all: index

index: $(OBJ)
 ${CC} ${CFLAGS} -o index $(OBJ)

index.o: index.cpp
 ${CC} $(CFLAGS) -c index.cpp

clean:
 rm index index.o

入出力結果(Terminal)

$ cat index.dat 
5 beta
6 beta
10 alpha
18 beta
20 alpha
30 alpha
$ make
g++ -g -Wall -c index.cpp
g++ -g -Wall -o index index.o
$ ./index index.dat index.txt
$ cat index.dat
5 beta
6 beta
10 alpha
18 beta
20 alpha
30 alpha
$ cat index.txt 
alpha 10 20 30 
beta 5 6 18 
$

0 コメント:

コメントを投稿