2014年3月27日木曜日

開発環境

C++実践プログラミング (スティーブ オウアルライン (著)、Steve Oualline (原著)、Steve Oualline(原著)、望月 康司(翻訳)、クイープ(翻訳) 、オライリー・ジャパン)のⅣ部(高度なプログラミング概念)の16章(ファイル入出力)、16.4(EOLの不思議)、設問 16-1.を解いてみる。

その他参考書籍

設問 16-1.

ファイルをASCIIファイルとして開いているため、DOS/Windowsではバイナリファイルを書き出す際に、改行文字「\n」(0x0a, 10)が2文字(CR(追加される文字), LF)になり、128バイトではなく129バイトになる。UNIX(Mac OS X)では、ASCIIとバイナリに違いはなく、改行文字「\n」(0xA)は1文字のままなので128バイトのファイルを生成する。

確認。

コード(BBEdit, Emacs)

sample284.cpp

#include <iostream>
#include <string>

// 問題のコードのstd::stringへのポインタを返す
// std::string& tmp_name()
// 値を返すように変更
std::string tmp_name1()
{
  std::string name;

  static int sequence = 0;

  ++sequence;

  name = "tmp";

  name += static_cast<char>(sequence + '0');

  return (name);
}

// もう一つの解決方法
// nameをstatic変数に変更
std::string tmp_name2()
{
  static std::string name;

  static int sequence = 0;

  ++sequence;

  name = "tmp";

  name += static_cast<char>(sequence + '0');

  return (name);
}

int main(int argc, char *argv[])
{
  std::string name11 = tmp_name1();
  std::string name12 = tmp_name1();

  std::string name21 = tmp_name2();
  std::string name22 = tmp_name2();

  std::cout << "Name11: " << name11 << '\n';
  std::cout << "Name12: " << name12 << '\n';

  std::cout << "Name21: " << name21 << '\n';
  std::cout << "Name22: " << name22 << '\n';
  return (0);
}

Makefile

#
# FSFのg++コンパイラ用のMakefile
#
CC=g++
CFLAGS=-g -Wall
all: sample284

sample284: sample284.cpp
 ${CC} ${CFLAGS} -o sample284 sample284.cpp

clean:
 rm sample284

Unix(Mac OS X)の場合。

入出力結果(Terminal)

$ ls -l test?.out
-rw-r--r--  1 kamimura  staff  128 Mar 27 14:12 test1.out
-rw-r--r--  1 kamimura  staff  128 Mar 27 14:12 test2.out
$

入出力結果(Cygwin64 Terminal)

$ g++ -g -Wall -o sample284 sample284.cpp


$ ./sample284.exe


$ ls -lh test?.out
-rwxrwxr-x 1 m なし 129 3月  27 14:28 test1.out
-rwxrwxr-x 1 m なし 128 3月  27 14:28 test2.out


$ 

0 コメント:

コメントを投稿