- ふむふむ。どうやらC++だって、バッファのサイズとかを気にしないでも結構便利に書けるらしいです。さすがですね。じゃあksgetsAのサンプルで行数比較をしてみようと思います。まずkclib1版のほうを少し可読性を下げて短くします。
#include "kclib1.h"
#include <stdio.h>
int main(int argc, const char **argv)
{
KAutoreleasePool *ap = KAutoreleasePool_open();
const char *s = kreadFileA(argv[1], "rb", NULL, 1 + 2);
for (int i = 1; *s != '\0'; i++)
printf("%08d: %s", i, ksgetsA(&s, 0));
KAutoreleasePool_close(ap);
return 0;
}
- これで12行。・・・ではC++で書いてみます。
#include <fstream>
#include <iostream>
#include <string>
#include <iomanip>
int main(int argc, const char **argv)
{
std::ifstream ifs(argv[1]);
std::string str;
if (ifs.fail()) {
std::cerr << "file open error." << std::endl;
return 1;
}
for (int i = 1; getline(ifs, str); i++)
std::cout << std::setw(8) << std::setfill('0') << i << ": " << str << std::endl;
return 0;
}
- うーん、17行ですね。エラー処理で4行も書かされてそこで損している感じです。
- まあメモリの使い方的にはC++版の方がかなりいいのですが、今はそこにはこだわっていないのです。メモリの使い方が悪くてもいいからとにかくリークしないってだけの条件下で書いたらどこまで短くできるかという比較なのです。
- 本質的な比較ということになれば、
const char *s = kreadFileA(argv[1], "rb", NULL, 1 + 2), *t;
for (int i = 1; *s != '\0'; i++)
printf("%08d: %s", i, ksgetsA(&s, 0));
- vs
std::ifstream ifs(argv[1]);
for (int i = 1; getline(ifs, str); i++)
std::cout << std::setw(8) << std::setfill('0') << i << ": " << str << std::endl;
- ということになって、まあどっちも3行程度だっていう感じですね。これ以上短くするのは現実的じゃない気がするので、あとはやっぱりエラー処理みたいな本質的じゃないところをライブラリで隠していくしかないです。だからkclib1の方向性は正しいと私は確信します。