HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0507
Keiファイル読み込み・変数12解決


Kei

リンク

2006/5/7(Sun) 21:19:26|NO.631

こんにちは、ファイル読み込みや変数について質問があります。
いろいろ探してみましたが分かりませんでした。

iniファイルに変数(set="フォルダのアドレス")を記入しておいて
noteloadでファイル内容を飲み込んでもsetという変数は使えません。
iniファイルに記述している変数をプログラム内で変数として利用するにはどうすればいいのでしょうか

また、変数内から先頭から5文字切り取る事は可能でしょうか。
例えば、aaaaaこんにちはという変数のaを切り取りこんにちはだけにする

よろしくお願いします。



この記事に返信する


911

リンク

2006/5/8(Mon) 01:00:04|NO.632

こっから考えてみてください。

FileName = "set.ini" ; ファイル名 ; SET = dir_desktop ; デスクトップのディレクトリ ; exist FileName : if (strsize = -1) { ; FileNameを検索 notesel BUF noteadd SET,0,1 ; 0行目にSETの内容を追加 noteadd "aaaaaこんにちわ",1,1 ; 1行目にaaaaaなんたらをいれる notesave FileName ; FileNameとして保存 noteunsel } ; ; ここからが本題 ; notesel BUF noteload FileName noteget SET,0 ; 0行目を抜き出してSETに代入 noteget AISATU,1 ; 1行目を抜き出してAISATUに代入 ; ; ついでに5文字目を抜き出し ; [strmidの説明] ; 変数SETの内容の 0〜5文字を抜き出す" SET,0,5 "の部分 ; 関数なので = で A に代入する ; そうすると、 SETの0〜5が A となる ; A = strmid(AISATU,0,5) ; noteunsel ; mes "SET = "+SET+"" mes "AISATU(0,5) = "+A+""



911

リンク

2006/5/8(Mon) 01:02:46|NO.633

ついでに

> ; ついでに5文字目を抜き出し
> ; [strmidの説明]
> ; 変数SETの内容の 0〜5文字を抜き出す" SET,0,5 "の部分
> ; 関数なので = で A に代入する
> ; そうすると、 SETの0〜5が A となる

は、SETじゃなくてAISATUでした。
がんばってください〜ノシ



ぽんず

リンク

2006/5/8(Mon) 10:29:23|NO.636

> iniファイルに変数(set="フォルダのアドレス")を記入しておいて
> noteloadでファイル内容を飲み込んでもsetという変数は使えません。
> iniファイルに記述している変数をプログラム内で変数として利用するにはどうすればいいのでしょうか

noteloadというのはファイルの内容「全体」をnoteselで指定した変数に確保する命令です。
変数容量の可変機能がついたbload命令だと思ってください。
で、そのような記述をしたい場合は、

 0.iniファイルに書く変数名をあらかじめプログラム上で宣言しておく
 1.iniファイルを読み込む
 2.読み込んだ変数内から変数名を検索する
 3.その変数に代入

変数に代入するときには文字列操作が必要ですけど・・・
ちなみに「"」記号を検索するときは「\"」としないとエラーが出ることがあるのでご注意ください。



Irisawa

リンク

2006/5/8(Mon) 13:41:10|NO.640

>>ぽんずさん
> noteloadというのはファイルの内容「全体」をnoteselで指定した変数に確保する命令です。
> 変数容量の可変機能がついたbload命令だと思ってください。

ちょっと勘違いされているようなので補足します。
HSP3では基本的にHSP内蔵命令で変数に格納する処理をした場合はバッファサイズが自動で
確保されます。
(自動で確保されないのはWinAPIなどのDLL関数を呼び出した場合だけです)

HSP3ではbloadもnoteloadもファイルの内容を読み込む際に自動でバッファサイズを確保
してくれます。
bloadとnoteloadの違いはbloadは主にバイナリデータを読み込む(binary load)ことで
noteloadはテキストデータ(文字列データ)を読み込むことです。
bloadは数値0x00以降も読み込みますがnoteloadは0x00をNULLと見なし、それ以降は無視
します。
また、bloadは数値データも読み込めます。
(bloadの場合は0x00を数値の0と見なすので読み込めますが文字列変数に読み込んだ場合は
NULL以降は無視されます)

因みに独自形式のINIファイルでなければWinAPI関数を使用した方がいいと思います。
よくINI操作APIは効率が悪くて遅いと言われますがいろいろ面倒なことを自動でやって
くれるので便利だと思います。
ただし、独自形式のINIファイル(標準フォーマットと異なる場合)は正常に読み込めないので
ご注意ください。

http://www.mb.ccnw.ne.jp/garger-studio/vbgame/163.html



ぽんず

リンク

2006/5/8(Mon) 14:17:31|NO.641

>>Irisawaさん
命令の内部構造はわかっていますが、わかりやすく言おうとしただけなんです・・・
ちょっと簡単に言いすぎましたねw申し訳ないです。



ぽんず

リンク

2006/5/8(Mon) 14:28:48|NO.642

連レス失礼ですが
追記
bloadでバッファの確保が行われること、今初めて知りました^^;;;;;



Irisawa

リンク

2006/5/8(Mon) 14:35:24|NO.643

あれ?
すみません。
こちらの方こそ勘違いしていたみたいです。
バッファ確保されていませんね。
ごめんなさい。



Irisawa

リンク

2006/5/8(Mon) 14:36:25|NO.644

APIを使用したINIファイルの読み書き例です。


#uselib "kernel32.dll" #cfunc WritePrivateProfileString "WritePrivateProfileStringA" sptr, sptr, sptr, sptr #cfunc GetPrivateProfileInt "GetPrivateProfileIntA" sptr, sptr, int, sptr #cfunc GetPrivateProfileString "GetPrivateProfileStringA" sptr, sptr, sptr, var, int, sptr ; 数値の書き込み nFileName = dirinfo(1) + "/test.ini" ; INI ファイルのパス & ファイル名 MainName = "section" ; セクション名 SubName = "inikey" ; キー名 WriteName = str(0) ; 値 Ret = WritePrivateProfileString(MainName, SubName, WriteName, nFileName) memset nFileName, 0, strlen(nFileName) memset MainName, 0, strlen(MainName) memset WriteName, 0, strlen(WriteName) Ret = 0 ; 文字列の書き込み nFileName = dirinfo(1) + "/test.ini" ; INI ファイルのパス & ファイル名 MainName = "section" ; セクション名 SubName = "strkey" ; キー名 WriteName = "value" ; 値 Ret = WritePrivateProfileString(MainName, SubName, WriteName, nFileName) memset nFileName, 0, strlen(nFileName) memset MainName, 0, strlen(MainName) memset WriteName, 0, strlen(WriteName) Ret = 0 ; 数値の読み込み nFileName = dirinfo(1) + "/test.ini" ; INI ファイルのパス & ファイル名 MainName = "section" ; セクション名 SubName = "inikey" ; キー名 Ret = GetPrivateProfileInt(MainName, SubName, 0xffffffff, nFileName) dialog strf("%x", Ret), , "inikey キーの内容" memset nFileName, 0, strlen(nFileName) memset MainName, 0, strlen(MainName) memset WriteName, 0, strlen(WriteName) Ret = 0 ; 文字列の読み込み sdim nName, 256 nFileName = dirinfo(1) + "/test.ini" ; INI ファイルのパス & ファイル名 MainName = "section" ; セクション名 SubName = "strkey" ; キー名 nDefault = "存在しません" Ret = GetPrivateProfileString(MainName, SubName, nDefault, nName, 256, nFileName) dialog nName, , "strkey キーの内容" stop



Irisawa

リンク

2006/5/8(Mon) 14:42:56|NO.645

>>643

よく確認してから書き込むべきでした。
そう思いこんでいただけなのかな。
なんか、ちゃんと確保していたような気がしたのですが...。
まあ、手動で確保しておくのが一番確実でしょうが。(^_^;(←いいわけ?)



ぽんず

リンク

2006/5/8(Mon) 15:38:26|NO.647

>>Irisawaさん
いえいえ、私が知らなかっただけで、bloadのヘルプを見ると、
「自動的に変数バッファのサイズが設定されます」
との事なので、Irisawaさんが正しいですよ^^



kz3

リンク

2006/5/8(Mon) 15:54:53|NO.648

>noteloadは0x00をNULLと見なし、それ以降は無視します。
間違いです。
noteloadは特に指定がなければファイルサイズ分読み込みます。
( 自動確保されるサイズはファイルサイズ+1 )
ただし、読み込んだバッファ( 強制的に文字列型 )をそのままmesなどで表示した場合は、
文字列ルールが適用されます。
notesel obj
noteload dir_cur+"/obj" exist dir_cur+"/obj" repeat strsize/100 buf=strf("%08x",lpeek(obj,cnt*4)) repeat 2 wc = wpeek( buf, cnt*2 ) wpoke buf, cnt*2, wpeek( buf, 6-cnt*2 ) wpoke buf, 6-cnt*2, wc loop mes buf loop



Kei

リンク

2006/5/8(Mon) 19:12:11|NO.652

911さん、ぽんずさん、Irisawaさん、kz3さん
ご丁寧に教えて頂きありがとうございます。
みなさんから教えてもらった事を勉強してみたいと思います。
ありがとうございましたm(_ _)m



ONION software Copyright 1997-2023(c) All rights reserved.