テキストの読み書き

Apple-Style Plusさんに登録されている方のブログを拝見していると、この休みを利用してCocoaプログラミングに挑戦している方が結構いらっしゃるようですね。
こういうの始める時って、やっぱりまとまった休みでないとなかなか・・・ね。
いったん始めてしまえば暇な時を見つけてチョイチョイできますけど。
明日あさっては、GW毎年恒例のSUPER GT第3戦富士を観戦する予定なので、今日はCocoaの日としよう。
・・・天気良いけど。
さて、この間テキストファイルの読み込部分のみ載せたコードですが、書き込みとかその周辺もできたので全部載せてみます。
何かの足しになれば良いですけど。
あ、そうそう。
メモリ管理の話がまだ理解が追いついていなくて、その辺りの処理は入っていません。


//
//  CocoaSample4.m
//  CocoaSample4
//
//  Created by D.S on 09/04/30.
//  Copyright 2009 __MyCompanyName__. All rights reserved.
//
#import "CocoaSample4.h"
@implementation CocoaSample4
/*
Openボタン押下時の処理
*/
- (IBAction)open:(id)sender;
{
// NSOpenPanelのインスタンス生成
NSOpenPanel *openPanel = [ NSOpenPanel openPanel ];
// NSOpenPanel表示
[ openPanel beginSheetForDirectory:@"~/" file:@"" types: nil
modalForWindow:[ sender window ] modalDelegate:self
didEndSelector:@selector( openPanelDidEnd: returnCode: contextInfo: ) contextInfo:nil ];
}
/*
saveボタン押下時の処理
*/
- (IBAction)save:(id)sender;
{
// NSSavePanelのインスタンスを生成
NSSavePanel *savePanel = [ NSSavePanel savePanel ];
// NSSavePanel表示
[ savePanel beginSheetForDirectory:@"~/" file:@"" modalForWindow:[ sender window ]
modalDelegate:self didEndSelector:@selector( savePanelDidEnd: returnCode: contextInfo: )
contextInfo:nil ];
}
/*
NSOpenPanel終了時の処理
*/
- (void)openPanelDidEnd:( NSOpenPanel * )panel returnCode:( NSInteger )code contextInfo:( void * )contextInfo {
NSString *string = nil;
NSError  *error;
// 押下されたボタンの判定
if( code == NSCancelButton ) {
/* Cancelボタン時 */
// 何もせず終了
return;
}
//
// とりあえず、SIJIで読み込んでだめならUTF8で読み込む。それだダメならreturn
//
// 選択されたファイル名称を取得
NSString *path = [ panel filename ];
// エンコーディングにNSShiftJISStringEncodingを指定してファイルを読み込む
string = [ NSString stringWithContentsOfFile:path encoding:NSShiftJISStringEncoding error:&error ];
// 読み込めたか判定
if( string == nil ) {
/* 読み込めなかった場合 */
// エンコーディングにNSUTF8StringEncodingを指定してファイルを読み込む
string = [ NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error ];
// 読み込めたか判定
if ( string == nil ) {
/* 読み込めなかった場合 */
// エラー出力
NSLog( [ error localizedDescription ] );
return;
}
}
// テキストエリアに読み込んだ内容を出力
[ textView setString: string ];
}
/*
NSSavePanel終了時の処理
*/
- (void)savePanelDidEnd:( NSSavePanel * )panel returnCode:( NSInteger )code contextInfo:( void * )contextInfo {
NSString *string = nil;
NSError  *error;
// 押下されたボタンの判定
if( code == NSCancelButton ) {
/* Cancelボタン時 */
// 何もせず終了
return;
}
// ファイル名称を取得
NSString *filename = [ panel filename ];
// テキストエリアから表示されているテキストを取得
string = [ textView string ];
// 取得したテキストをファイルに書き出す
BOOL result = [ string writeToFile:filename atomically:YES encoding:NSUTF8StringEncoding error:&error ];
// 書き出しが正常であったか判定
if( result != YES ) {
// エラー出力
NSLog( [ error localizedDescription ] );
}
}
@end

Cocoaのエンコーディング

とりあえず一個題材を決めて勉強しています。
今やっているのは、テキストファイルをNSOpenPanelで選択してNSTextViewに表示し、さらにファイルへ書き出すというものです。
Cocoa-Javaでも似たようなことを以前やっていたので、なんとなく分かるのですが、読み込むテキストのエンコーディングについて良くわからなくてウェブで色々調べてました。
Cocoa-Javaの時は意識していたかどうか定かではないのですが、読み込むファイルのエンコーディングがUTF-8だったりSJISだったEUCだったり・・・と様々な場合、ちゃんと化けずに読めるのかな?と。
たぶん英数字しか入ってないファイルであれば読めてしまうんでしょうけど、2バイト文字の日本語とかが入っているとどうなるのやら・・・。
で、結論から言うと、化けるというか読み込んでくれません。
使ったメソッドはNSStringの+ (id)stringWithContentsOfFile:(NSString *) path usedEncoding:(NSStringEncoding *) enc error:(NSError **) errorです。
※頭に+が付いてるとクラスメソッド、-だとインスタンスメソッドだそうです。
リファレンスを見ると、読み込んだファイルのエンコーディングを教えてくれるようなので、なんでも嫌わずに読み込んでくれるのかと思いましたがだめでした。
これが使えると、ブラウザで言うところの自動判別みたいなものが出来て楽だと思うのですけど、なんだかちゃんと動きません。
それでウェブで調べてみると、Cocoaのエンコーディングはどうなっておるのだ? – Nothing Upstairsという記事を見つけました。
なるほどやっぱりダメなんですね。
ということで、読み込むファイルのエンコーディングが分からない時は、トライアンドエラーするしかないのですかね。
ブラウザとかテキストエディタとかの実装ってみんなそうしているだろうか。
良くわかりませんが、とりあえず+ (id)stringWithContentsOfFile:(NSString *) path encoding:(NSStringEncoding) enc error:(NSError **) errorを使うことにして、NSStringEncodingに片っ端からエンコーディングを指定していくしかないのかな。
合ってるのかね??


/*
NSOpenPanel終了時の処理
*/
- (void)openPanelDidEnd:( NSOpenPanel * )panel returnCode:( NSInteger )code {
NSString *string = nil;
//NSStringEncoding encoding = 0;
NSError *error;
// 押下されたボタンの判定
if( code == NSCancelButton ) {
/* Cancelボタン時 */
// 何もせず終了
return;
}
//
// とりあえず、SJISで読み込んでだめならUTF8で読み込む。それだダメならreturn
//
// 選択されたファイル名称を取得
NSString *path = [ panel filename ];
// エンコーディングにNSShiftJISStringEncodingを指定してファイルを読み込む
string = [ NSString stringWithContentsOfFile:path encoding:NSShiftJISStringEncoding error:&error ];
// 読み込めたか判定
if( string == nil ) {
/* 読み込めなかった場合 */
// エンコーディングにNSUTF8StringEncodingを指定してファイルを読み込む
string = [ NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error ];
// 読み込めたか判定
if ( string == nil ) {
/* 読み込めなかった場合 */
// エラー出力
NSLog( [ error localizedDescription ] );
return;
}
}
// テキストエリアに読み込んだ内容を出力
[ textView setString: string ];
}

Cocoaリファレンス

だんだんとObjective-Cの[やら:に慣れてきました。
さて、クラスの仕様を調べたりするのに、Appleで公開されているリファレンスを見ます。
Appleのウェブページを見たり、Xcodeの製品ドキュメントから見ても良いのですが、Cocoa Browser Airというアプリケーションを使うと大変見やすいです。
できれば前回開いていたページを記憶しておいてくれるとうれしいのですが・・・。あと現バージョンでは検索ができないようです。

もう一つリファレンス関連でありがたいのが、Cocoa Break!さんで公開されている日本語訳です。
Mac OS X v10.5系はまだ完全ではないようですが、Foundationは揃っていますし、重宝することと思います。
これ大変な作業ですよ。素晴らしい。

Cocoa-Objective-C始めました。

さてGWに入りました。
画策していた12連休は残念ながら失敗に終わりましたが、8連休ということでまずまずです。
しかし長期連休を取得できても、現在人生最大級でお金がないため、どっちにしろたいした遊びはできずに残念。
そんなわけで、ずっと以前からチャレンジしようと考えていたことに取り込むことにしました。
Cocoa-Objective-Cです。
遥か昔に、Cocoa Beiginnersというセクションで、Cocoa-Javaで作るMac OS Xアプリケーションについて書いていました。
書いていたと言うより、自分で勉強した内容を備忘録として載せていたようなものですが。
当時なぜCocoa-Javaを選んだかというと、Cocoa-Javaの情報があまり無かったので役立つかなと思ったのと、はっきり言ってObjective-CってMac OS Xアプリ専用のプログラミング言語と言っても過言ではない程ニッチ過ぎて、それならばメジャーな言語であるJavaを勉強しながら、Mac OS Xのアプリを作れれば幸せだなと思ったのが理由でした。
しかし時は過ぎ、Cocoa-JavaはAppleから見限られてしまいCocoa-Javaを追求する意味もなくなり、さらにiPhoneという素晴らしいデバイスが誕生し、そのアプリの開発のためにはObjective-Cが必須である昨今。
ならば本気でObjective-Cをがんばってみようじゃないか。
この不況な世の中。暇はあってもカネはない。
そんな時こそまさにうってつけの課題。
Macさえあれば、開発環境は全て無料で手に入ります。
やってやろうじゃないか!
そう意気込んでいる現在であります。
チョイチョイとコードを書いたりしてみてますけど、やっぱりこの文法慣れない。
C言語を知っていると割と簡単に習得できるとの評判ですが、文法がとにかく慣れない印象です。
[とか:とかたくさんあって、もー!みたいな。
あと、ラベルとかって概念もあったりして、どれがラベルでどれが引数なんだかパッと分からん!
ごちゃごちゃと文章のような文法です。
までも慣れなんでしょうけどね。
あ、そうそう。
ウェブだけを見てなんとかしようと思っていましたが、やっぱり紙媒体の参考書が手元にあると便利なので、下記、2つの本を買いました。
どちらも有名ですよね。著者さんはHMDTの木下さんです。


たのしいCocoaプログラミング[Leopard対応版]

自作アプリをApp Storeで世界に向けて販売できる!! iPhone SDKプログラミング大全 (MacPeople Books)
最終的にはiPhoneアプリを作りたいと思っているのですが、iPhone SDKプログラミング大全の方を見るのはまだ先ですかね。
Mac OS Xのアプリ制作にまずは慣れたいです。

Cocoa-Java終焉?

スラッシュドットジャパンで知りましたが、開発者向けのCocoa-Java Integration Guideっちゅードキュメントに、Mac OS X v10.4以降の新機能は、Cocoa-Javaには追加されないから、Objective-Cを使ってCocoaアプリケーションを開発するべき、との警告が記載されているとのこと。
・・・ホントだ。事実上、Cocoa-Javaの終焉宣言じゃないすか。
最近Cocoa-Javaサボってた天罰か?そもそも人口が少なそうではあったけど・・・。
少なそうだからこそウチのinfo@Mackersではメインとしてとりあげてみてたんだけど・・・。なくなっちゃあねぇ・・・。さみし。

PAGE TOP