• 検索結果がありません。

便利な関数

ドキュメント内 ÆþÌçGTK+ (ページ 62-68)

第 4 章 GLib 49

4.2 便利な関数

ここではGLibで提供されている関数をカテゴリ別にいくつか紹介します.

4.2.1 文字列操作関数

g strdup

文字列をコピーして,新しく確保した領域へのポインタを返します.

g c h a r* g _ s t r d u p (c o n s t g c h a r * s t r ) ; 第1引数 コピーする文字列.

戻り値 コピーした文字列.

gchar *copy;

copy = g_strdup ("Hello GTK+ World!");

g_print ("%s\n", copy);

g strdup printf

指定したフォーマットと引数に与えたパラメータにより文字列を作成して,新しく確保した領域へのポインタを返しま

す.関数sprintfと同じ働きをしますが,あらかじめ作成される文字列用の領域を確保しておく必要がありません.

g c h a r* g _ s t r d u p _ p r i n t f (c o n s t g c h a r * f o r m a t , . . . ) ; 第1引数 生成したい文字列のフォーマット.

第2引数以降 フォーマットに応じた値.

戻り値 生成した文字列.

int n;

for (n = 0; n < 10; n++) {

gchar *text;

text = g strdup printf ("chapter-%d", n);

g print ("%s\n", text);

g free (text);

}

g strsplit

文字列stringを区切り文字delimiterで最大max tokens個に分割する関数です.

g c h a r* * g _ s t r s p l i t (c o n s t g c h a r * s t r i n g , c o n s t g c h a r * d e l i m i t e r , g i n t m a x _ t o k e n s ) ; 第1引数 入力文字列.

第2引数 区切り文字.

第3引数 最大分割数.1より小さい値を指定すると入力文字列を完全に分割する.

戻り値 生成した文字列の配列.配列の最後はNULLで終わる.

const gchar *string = "This is a sample of g_strsplit.";

gchar **text;

int n;

text = g_strsplit (string, " ", 0);

for (n = 0; text[n] != NULL; n++)

{

g_print ("%s\n", text[n]);

}

g_strfreev (text);

g new0

指定したデータ型struct typeのメモリ領域をn structs分確保し,0で初期化して,その先頭アドレスを返します.こ

の関数はg malloc0のマクロとして定義されています.

# d e f i n e g _ n e w 0 ( s t r u c t _ t y p e , n _ s t r u c t s ) \

( ( s t r u c t _ t y p e * ) g _ m a l l o c 0 ( ( (g s i z e) s i z e o f ( s t r u c t _ t y p e ) ) * \ ( (g s i z e) ( n _ s t r u c t s ) ) ) )

g p o i n t e r g _ m a l l o c 0 (g u l o n g n _ b y t e s ) ; 第1引数 生成するデータ型.

第2引数 データ数.

戻り値 確保したメモリ領域の先頭アドレス.

gint *array;

int n;

array = g_new0 (gint, 10);

for (n = 0; n < 10; n++) {

g_print ("%d\n", array[n]);

}

g_free (array);

g free

マクロg new0等で確保されたメモリ領域を解放する関数です.

v o i d g _ f r e e (g p o i n t e r m e m ) ;

第1引数 解放するメモリ領域の先頭アドレス.

g strfreev

関数g strsplit等で確保された文字列の配列領域を解放する関数です.

v o i d g _ s t r f r e e v (g c h a r * * s t r _ a r r a y ) ; 第1引数 解放するメモリ領域の先頭アドレス.

4.2.2 ファイルアクセス関数

g file test

GFileTestで定義されたファイルの状態を調べる関数です.第2引数に与える値によって,ファイルが存在するか,ファ

イルがディレクトリであるかなどを調べることができます.

g b o o l e a n g _ f i l e _ t e s t (c o n s t g c h a r * f i l e n a m e , G F i l e T e s t t e s t ) ; 第1引数 ファイル名.

第2引数 テストしたい内容に応じた値.

戻り値 調べる内容に合致した場合はTRUE,合致しなければFALSEを返す.

g dir open

ディレクトリをオープンする関数です.オープンしたディレクトリ内のファイル名を調べるには関数g dir read nameを 使用します.

表4.2 GFileTestの値

値 説明

G FILE TEST IS REGULAR ファイルかどうか調べる.

G FILE TEST IS SYMLINK シンボリックリンクかどうか調べる.

G FILE TEST IS DIR ディレクトリかどうか調べる.

G FILE TEST IS EXECUTABLE 実行形式のファイルかどうか調べる.

G FILE TEST EXISTS ファイルが存在するかどうか調べる.

G D i r* g _ d i r _ o p e n (c o n s t g c h a r * p a t h ,

g u i n t f l a g s ,

G E r r o r * * e r r o r ) ; 第1引数 オープンしたいディレクトリ名.

第2引数 フラグ.

第3引数 エラー情報.

戻り値 ディレクトリ構造体.

g dir read name

関数g dir openでオープンしたディレクトリ内のファイル名を調べる関数です.呼び出されるごとに順にファイル名を

返していきます.最後まで読み込んだ場合はNULLが返ります.

G _ C O N S T _ R E T U R N g c h a r* g _ d i r _ r e a d _ n a m e (G D i r * d i r ) ; 第1引数 ディレクトリ構造体.

戻り値 ファイル名.

g dir close

関数g dir openでオープンしたディレクトリをクローズする関数です.

v o i d g _ d i r _ c l o s e (G D i r * d i r ) ; 第1引数 ディレクトリ構造体.

サンプルプログラム

上記の関数を使用したプログラムの例をソース4–1に示します.このプログラムは引数に指定したディレクトリ内のファイ ルの一覧を表示するプログラムです.

ディレクトリのオープン(16行目)

関数g dir openの第1引数にオープンするディレクトリ名を指定してディレクトリをオープンします.現在の仕様では第2

引数には0のみを指定することになっています.第3引数にはGError構造体へのポインタを指定しますが,エラーの詳細が必 要ない場合にはNULLを与えておけばよいでしょう.ディレクトリのオープンに失敗するとNULLが返ってきます.

ディレクトリ内のファイルの表示(21–30行目)

21行目からのwhileループでは,関数g dir read nameによってオープンしたディレクトリ内のファイル名を1つずつ取得 していきます.そして関数g file testでファイルがディレクトリかどうか調べるために,関数g build filenameを使用してファ イル名にパスを追加しています.関数g build filenameではファイル名用のメモリ領域が新しく領域確保されるので,29行目

で関数g freeで使用しなくなったメモリ領域を解放しています.

ディレクトリのクローズ(31行目)

最後に関数g dir closeでディレクトリをクローズしています.

プログラムの実行結果を以下に示します.

$ gcc file-sample.c -o file-sample ‘pkg-config --cflags --libs glib-2.0‘

$ ./file-sample . file-sample.c (file) file-sample (file) file-sample.o (file) Makefile (file) test-dir (directory)

$

ソース4–1 ファイル操作の例: file-sample.c

1 # i n c l u d e <g l i b . h >

2 # i n c l u d e <s t d l i b . h >

3 4 i n t

5 m a i n (i n t a r g c , c h a r * * a r g v )

6 {

7 G D i r * d i r ;

8 g c h a r * c u r r e n t d i r ;

9

10 i f ( a r g c ! = 2 )

11 {

12 g _ p r i n t ( " U s a g e : . / f i l e - s a m p l e d i r e c t o r y \ n " ) ;

13 e x i t ( 1 ) ;

14 }

15 c u r r e n t d i r = a r g v [ 1 ] ;

16 d i r = g _ d i r _ o p e n ( c u r r e n t d i r , 0 , N U L L ) ;

17 i f ( d i r )

18 {

19 c o n s t g c h a r * n a m e ;

20

21 w h i l e ( n a m e = g _ d i r _ r e a d _ n a m e ( d i r ) )

22 {

23 g c h a r * p a t h ;

24 g b o o l e a n i s _ d i r ;

25

26 p a t h = g _ b u i l d _ f i l e n a m e ( c u r r e n t d i r , n a m e , N U L L ) ;

27 i s _ d i r = g _ f i l e _ t e s t ( p a t h , G _ F I L E _ T E S T _ I S _ D I R ) ;

28 g _ p r i n t ( " % s \ t ( % s ) \ n " , n a m e , ( i s _ d i r ) ? " d i r e c t o r y " : " f i l e " ) ;

29 g _ f r e e ( p a t h ) ;

30 }

31 g _ d i r _ c l o s e ( d i r ) ;

32 }

33 r e t u r n 0 ;

34 }

4.2.3 Unicode に関する関数

日本語の文字コードには,シフトJISや日本語EUCが使われてきました.最近使用されることの多くなった文字コードに,

国際規格の「Unicode」があります.GLibでも,ファイル名の文字列にUnicode(UTF-8)を採用しています.

このためGLibでは,ユーザーの使用している各国環境(ロケール)で規定される文字コードと,UTF-8の相互変換を行う関 数を提供しています.以下にその例を示します.

g locale to utf8

現在のロケールで与えられた文字列を,UTF-8でエンコードされた文字列に変換する関数です.この関数では新しい文 字列用のメモリ領域が確保されるので,作成した文字列が使用されなくなった場合には,関数g freeでメモリ領域を解放 してください.

g c h a r* g _ l o c a l e _ t o _ u t f 8 (c o n s t g c h a r * o p s y s s t r i n g ,

g s s i z e len ,

g s i z e * b y t e s _ r e a d , g s i z e * b y t e s _ w r i t t e n , G E r r o r * * e r r o r ) ;

第1引数 文字列.

第2引数 文字列の長さ.1を指定すると文字列全体を変換する.

第3引数 読み込んだデータのバイト数.

第4引数 書き込んだデータのバイト数.

第5引数 エラー構造体.

戻り値 変換した文字列.

g locale from utf8

UTF8でエンコードされた文字列を,現在のロケールの文字コードに変換する関数です.この関数では新しい文字列用の メモリ領域が確保されるので,作成した文字列が使用されなくなった場合には,関数g freeでメモリ領域を解放してくだ さい.

g c h a r* g _ l o c a l e _ f r o m _ u t f 8 (c o n s t g c h a r * u t f 8 s t r i n g ,

g s s i z e len ,

g s i z e * b y t e s _ r e a d , g s i z e * b y t e s _ w r i t t e n , G E r r o r * * e r r o r ) ; 第1引数 文字列.

第2引数 文字列の長さ.1を指定すると文字列全体を変換する.

第3引数 読み込んだデータのバイト数.

第4引数 書き込んだデータのバイト数.

第5引数 エラー構造体.

戻り値 変換した文字列.

g filename to utf8

ファイル名の文字列をUTF8でエンコードされた文字列に変換する関数です.この関数では新しい文字列用のメモリ領 域が確保されるので,作成した文字列が使用されなくなった場合には,関数g freeでメモリ領域を解放してください.

g c h a r* g _ f i l e n a m e _ t o _ u t f 8 (c o n s t g c h a r * o p s y s s t r i n g ,

g s s i z e len ,

g s i z e * b y t e s _ r e a d , g s i z e * b y t e s _ w r i t t e n , G E r r o r * * e r r o r ) ; 第1引数 文字列.

第2引数 文字列の長さ.1を指定すると文字列全体を変換する.

第3引数 読み込んだデータのバイト数.

第4引数 書き込んだデータのバイト数.

第5引数 エラー構造体.

戻り値 変換した文字列.

g filename from utf8

UTF8でエンコードされた文字列をファイル名用のエンコーディングに変換する関数です.この関数では新しい文字列用 のメモリ領域が確保されるので,作成した文字列が使用されなくなった場合には,関数g freeでメモリ領域を解放してく ださい.

g c h a r* g _ f i l e n a m e _ f r o m _ u t f 8 (c o n s t g c h a r * u t f 8 s t r i n g ,

g s s i z e len ,

g s i z e * b y t e s _ r e a d , g s i z e * b y t e s _ w r i t t e n , G E r r o r * * e r r o r ) ;

第1引数 文字列.

第2引数 文字列の長さ.1を指定すると文字列全体を変換する.

第3引数 読み込んだデータのバイト数.

第4引数 書き込んだデータのバイト数.

第5引数 エラー構造体.

戻り値 変換した文字列.

4.2.4 その他の便利な関数

g get home dir

ユーザのホームディレクトリを取得する関数です.

G _ C O N S T _ R E T U R N g c h a r* g _ g e t _ h o m e _ d i r (v o i d) ; 戻り値 ホームディレクトリ名.

g_print ("My home directory is %s.\n", g_get_home_dir ());

g get current dir

現在のディレクトリを取得する関数です.この関数で取得したメモリ領域は関数g freeで解放する必要があります.

g c h a r* g _ g e t _ c u r r e n t _ d i r (v o i d) ; 戻り値 現在のディレクトリ名.

gchar *currentdir;

currentdir = g_get_current_dir ();

g_print ("The current directory is %s.\n", currentdir);

g_free (currentdir);

g path get basename

パスから最後のファイル名を返します.パスがディレクトリを指す場合には最後のディレクトリ名を返します.

g c h a r* g _ p a t h _ g e t _ b a s e n a m e (c o n s t g c h a r * f i l e _ n a m e ) ; 第1引数 パス.

戻り値 パスの最後のファイル名もしくはディレクトリ名.

g path get dirname

パスから最後のファイル名を取り除いたディレクトリ部分を返します.

g c h a r* g _ p a t h _ g e t _ d i r n a m e (c o n s t g c h a r * f i l e _ n a m e ) ; 第1引数 パス.

戻り値 パスから最後のファイル名を取り除いたディレクトリ名.

gchar *basename;

gchar *dirname;

basename = g_path_get_basename (filename);

dirname = g_path_get_dirname (filename);

g_print ("basename = %s\n", basename);

g_print ("dirname = %s\n", dirname);

g_free (basename);

g_free (dirname);

g build filename

引数に与えた文字列をファイル名用の区切り文字(例えば/)で結合して,1つの文字列を作成します.引数の最後は NULLで終わる必要があります.

g c h a r* g _ b u i l d _ f i l e n a m e (c o n s t g c h a r * f i r s t _ e l e m e n t , . . . ) ; 第1引数以降 文字列.

戻り値 生成されたパス.

const gchar *dirname = "/home/gtk";

const gchar *basename = "sample.c";

gchar *filename;

filename = g_build_filename (dirname, basename, NULL);

g_print ("filename = %s\n", filename);

g_free (filename);

ドキュメント内 ÆþÌçGTK+ (ページ 62-68)