[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 07/15 20:46 / Filesize : 200 KB / Number-of Response : 834
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.35【環境依存OK】



1 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 21:36:23 ]
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.34【環境依存OK】
pc10.2ch.net/test/read.cgi/tech/1169039760/
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

441 名前:429 mailto:sage [2007/03/12(月) 00:31:30 ]
すいません。

431さんの言うとうりセミコロンの付け忘れでした。

442 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 01:44:48 ]
>>431のエスパー能力に敬意を表する!

443 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 01:54:30 ]
これはもうメイクミラクルやね

444 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 06:03:42 ]
いや>>441は偽物だ。

三点リーダを>>429のように使えるはずないもん!

445 名前:デフォルトの名無しさん [2007/03/12(月) 11:07:51 ]
newとdeleteを頻繁に使うのはよくないですか?

446 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 11:09:38 ]
newは別にいいけど、deleteは例外安全や面倒くささを考慮して、
std::auto_ptrなど何らかのスマートポインタに入れておくべき。

447 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 16:47:03 ]
pを辿って99から1までを表示するプログラムです。

実行すると途中のcount=35あたりまで表示されてエラーが起こります。
メッセージ:「ハンドルされていない例外は TEST.exe にあります:0xC0000005: Access Violation。」

これは何故起こるのでしょうか。解決法もできれば教えてください。お願いします。
struct Test
{ int x;
 Test *p;
};
int main()
{ int i;
 std::vector<Test> v; //xに1〜99を順に入れていく。pには一つ前のポインタを入れる
 Test b;

 b.p = NULL;
 v.push_back(b);

 for (i=1;i<100;i++) { //
 b.x = i;
 b.p = &v[i-1];  //
 v.push_back(b);
 }

 Test *c;
 c = &v[v.size()-1];

 int count = 0;
 while ( c->p != NULL )  {      // NULLが出るまでpを辿る
  printf("%d: %d\n",count++,c->x);
  c = c->p;
 }                                                 長くなってすいません。

448 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 17:02:59 ]
push_backしていってvectorのサイズがでかくなったときにvector内部で再割り当てが起こってる。
なので&v[i-1]は途中から不正なポインタを指す。
なので本当は&v[i-1]が不変なのを期待しちゃダメ。

↓こうやって最初に100確保しておけば再割り当てが起こらないだろうから大丈夫。

int main()
{
int i;
std::vector<Test> v(100);
Test b;

b.p = NULL;
v[0] = b;

for (i=1;i<100;i++) {
b.x = i;
b.p = &v[i-1];
v[i] = b;
}

Test *c;
c = &v[v.size()-1];

int count = 0;
while ( c->p != NULL ) {
printf("%d: %d\n",count++,c->x);
c = c->p;
}
}

449 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 17:04:21 ]
あ、でも同僚がこんなコード打ったら殴る



450 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 17:59:18 ]
宣言した後に余裕を持ってNULLの要素を追加してやらないと駄目なのか
で、不足してきたらまた余裕を持ってNULLと末端の要素を
実際に割り当てた時は割り当てた所に書き込むのと同時に、末端となる位置も変えてやらにゃならん
こんな事してたらvectorの意味無いじゃん

451 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 18:13:42 ]
空でないディレクトリをまるごと
削除する関数ってあるでしょうか。
C++Builderです。

452 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 18:18:30 ]
C++Builderは知らんな。
Win32 APIにはSHFileOperationがあるが。

453 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 18:24:20 ]
system("rmdir /S /Q C:\");

454 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 18:30:34 ]
>>448
やはり場所が変わっていたのですか・・・
vectorを使うべきじゃなかったようですね
ありがとうございました。

455 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 18:44:58 ]
>>454
イレテータ使え

456 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 18:51:32 ]
つーかlist<int>使え

457 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 18:54:06 ]
>>452
SHFileOperationですか。
見てみたんですが、引数がたくさんあって難しそうですね。(汗
簡単な解説と使用例どこかにないか探して見ます。

>>453
おおお。今はこの方法で行きたいと思います。

ありがとうございました。

458 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 19:26:01 ]
すいませんが初心者の質問です。
あるクラス内でnewしたメンバ変数への参照かポインタを返す場合、
クラスの外側からdeleteさせないようにするにはどうすればいいんでしょうか?
constつければコンパイルエラーになるもんだと思ってたんですが、
試してみたらダメでした。

class moge;//詳細は略
class hoge{
 moge* mp;
 public:
 //略
 const moge * const getMp(){return mp;};
 const moge& getMRef(){return *mp};
}

void f(hoge& h){
 const moge * const mp = h.getMp();
 delete mp; //コンパイルエラーになってほしい
}

void g(hoge& h){
 const int& i = h.getRef();
 delete &i; //コンパイルエラーになってほしい
}

459 名前:458 mailto:sage [2007/03/12(月) 19:29:44 ]
すいません。g()がメチャクチャになってました。
void g(hoge& h){
 const moge& m = h.getMRef();
 delete &m;//コンパイルエラーになってほしい
}

が正しいですね。



460 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 19:32:01 ]
デストラクタをprivateへ移行

461 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 19:36:53 ]
>>455
std::vectorのイテレータは、
基のvectorの要素数が変わったら無効になってよいとなっているので、
何の解決にもならない。

462 名前:458 mailto:sage [2007/03/12(月) 20:02:43 ]
>>460 即レスありがとうございます。
確かに質問内容の答えにはなってるんですが、ちょっと説明不足でした。
class hogeのメンバ関数内でmogeをnewしていて、hogeのデストラクタで
deleteしたいんです。
mogeのデストラクタをprivateにするとhogeの破棄時にdeleteできずにメモリが
リークしてしまうという問題が出てしまいますよね。

463 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 20:16:05 ]
だったら、友達にでもしろよ。

464 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 20:21:16 ]
所有権が移動しないスマートポインタ使えば?

465 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 20:29:52 ]
クラスを1階層増やせばいいんでないの。
class IMoge{ protected:~IMoge(){}};
class moge : public IMoge{public:~moge(){} };
class hoge{ moge *mp;
   public : IMoge &getmogeref(){ return *mp; }
   ~hoge(){delete mp;} };

466 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 20:36:14 ]
そうだ、外側からdeleteしない設計にすればいいんだ!
うわ俺マジ頭良い^^

467 名前:458 mailto:sage [2007/03/12(月) 20:39:01 ]
>>463-465
どうもありがとうございます。
たぶん友達にするのが一番個人的な要求に合っていると思います。
というか、こんな基本的なことも浮かばないあたり、ダメダメですね。


468 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 00:04:47 ]
時間の都合だと思うが、>466のスルーされっぷりに噴いた。
いや、たぶん突っ込まれてもそれはそれで困るんだろうけど。

469 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 19:37:36 ]
以下のようなプログラムを実行すると
error LNK2019: 未解決の外部シンボル "public: void __thiscall C01::TEST(void)"〜
とでます。
inlineをはずれば通るのですが、どうしてもinlineを付けたいです。
解決方法御願いします。

//00.cpp
#include "01.h"
void main()
{
C01 c;
c.TEST();
}

//01.h
class C01
{
public:
void TEST();
};

//01.cpp
inline
void C01::TEST()
{
}



470 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 19:48:32 ]
01.hにコンストラクタの定義を書く。

471 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 19:49:28 ]
ヘッダに書けよ

472 名前:469 mailto:sage [2007/03/13(火) 21:04:32 ]
>>470
コンストラクタの有無は関係有りませんでした。

>>471
TEST()関数をヘッダに書いたら通りました。
有り難うございます。
ちなみに.cppの方に書く事は出来ないのでしょうか?

473 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 21:06:38 ]
cppファイルに定義を書くならinline付けるなよ。

474 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 21:07:28 ]
基本的に他のファイルから可視じゃないとinline展開はできない
リンカがやってくれたりもする場合もあるらしいけど

475 名前:469 mailto:sage [2007/03/13(火) 21:20:58 ]
>>473-474
なるほど、有り難うございます。

476 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 23:34:14 ]
OS RHEL V4.3

gcc version 3.4.6

コンパイルオプション
-D_XOPEN_SOURCE=600

警告: 引数 2 個の `read' を渡しますにより、ポインタの示す型か
らの修飾子が切り捨てられます。

read()を利用しているソースをコンパイルしようとすると上記のような
警告が出ます。なぜこんな警告が出るのかさっぱりです。

何かよい解決方法をご存知の方はおられませんか?

477 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 00:09:42 ]
ちょっとそのreadの周辺を晒してくれまいか?

478 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 01:27:36 ]
>>476
警告:readに渡す第二引き数のポインタ修飾子が剥がされます。

read()にconst char *渡したりしていない?

479 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 01:35:35 ]
引数2コのreadってなんだ。普通readは引数3コじゃないか。



480 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 01:44:53 ]
>>479
gccのエラーメッセージの日本語訳が無茶苦茶なの。正解は>478。

481 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 16:23:49 ]
for(int i=0; i<3; i++){
handle[i]=_beginthread(...);
}

//handle[0],handle[1],handle[2]どれから、終わるのかわかりません
for(int i=0; i<3; i++){
WaitForSingleObject( handle[i] , INFINITE );
}

3つスレッドを立ち上げましたが、後処理の方法で困っております。
上記のようにすると、WaitForSingleObjectで、
永遠に待つ状態になってしまいます。
どうするときれいに、後処理できるでしょうか?
よろしくお願いします。

482 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 16:25:03 ]
WaitForMultipleObject は?

483 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 16:44:15 ]
あと_beginthreadex使って自分でハンドルを閉じるようにしろ。

484 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 16:50:34 ]
っと、sがつくね、そういえば WaitForMultipleObjects

485 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 21:17:27 ]
C++のライブラリにファイルを扱うためのクラスはありませんか?

486 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 21:18:30 ]
std::fstreamのことを言っているのか?

487 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 21:27:52 ]
本当にありがとうございます

488 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 00:11:28 ]
ワラt

489 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 10:16:57 ]
>>482
レスありがとうございます。
for (int i=0; i<3; i++){
while(WaitForMultipleObjects(3, handle,TRUE, 1000) == WAIT_TIMEOUT){
OutputDebugString("タイムアウトしました");
}
OutputDebugString("タイムアウト以外デス");
}
これで、きれいに後処理できました。

>>483
_beginthreadは、CloseHandle()しなくても、自動で閉じてるかもしれないです。
ネットで検索すると、自動で閉じてるみたいなこと書いてありました。
試しにCloseHandle()してみると、エラーでました。
環境は、C++Builderですが、_beginthreadexを使用したほうが、良いのでしょうか?



490 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 13:10:23 ]
環境はWindowsです。
URLデコードについて教えてください。
ttp://work.tkensaku.com/tool/urldec.html
こちらのサイトなど、インターネットに落ちているものを利用して
デコードしてみたのですが、きちんとデコードできるときとできないときがあります。

例えば、
1.「%82%A0%82%A0%82%A0」->「あああ」
2.「%E6%96%B0%E8%A6%8F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%20%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88.txt」->「譁ー隕上ユ繧ュ繧ケ繝・繝峨く繝・繝。繝ウ繝・txt」

1は、うまくいきましたが2が文字化けしてしまいました。
ttp://www.taka-k.com/pg.html
こちらの関数で、確認しましたが同様に「譁ー隕上ユ繧ュ繧ケ繝・繝峨く繝・繝。繝ウ繝・txt」と出力されました。

ttp://www.tagindex.com/tool/url.htmlで、2を確認すると「新規テキスト ドキュメント.txt」と正常に表示されました。
「新規テキスト ドキュメント.txt」->「%E6%96%B0%E8%A6%8F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%20%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88.txt」
のエンコードは正常なのかもしれません。
何が原因なのかわからないのですが、どうすれば常に正常にデコードできるでしょうか。
よろしくお願いします。

491 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 13:13:11 ]
それはもしかして文字コードの違いなのでは?

492 名前:デフォルトの名無しさん [2007/03/15(木) 13:27:10 ]
質問です。
templateを使っているのですが、
template<class T>とした時、このTが「IHogeを継承したクラスかどうか」を判断する方法はないでしょうか?

if (isIHogesChild(T))
{
 IHogeを継承しているときの処理.
}
else
{
 それ意外の時の処理.
}
とやりたいのです。

493 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 14:14:16 ]
>>490
1はCP932、2はUTF-8。UTF-8をCP932環境で表示しようとするから文字化けしているだけ。

494 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 14:48:28 ]
>>491
>>493
>1はCP932、2はUTF-8。UTF-8をCP932環境で表示しようとするから文字化けしているだけ。
すごい。どうやって2はUTF-8とわかるのでしょうか。
「%E6%96・・・」を眺めているとわかるのですか?


495 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 14:51:43 ]
UTF-8は文字の先頭バイトの頭のビットが立ってたら2番目も必ず立つからな
そして、3バイト文字なら1110 で始まるので必ずEで始まる。

496 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 14:53:50 ]
眺めていても判るが、念の為にiconv -f CP932 -t UTF-8|od -t x1を実行して「新規テキスト ドキュメント」をペーストして見た。
で、予想通りこんな出力が得られたわけだ。
--
0000000 e6 96 b0 e8 a6 8f e3 83 86 e3 82 ad e3 82 b9 e3
0000020 83 88 20 e3 83 89 e3 82 ad e3 83 a5 e3 83 a1 e3
0000040 83 b3 e3 83 88 0a
0000046


497 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 15:31:49 ]
>>492
boost::is_base_of<IHoge, T>

498 名前:デフォルトの名無しさん [2007/03/15(木) 16:49:31 ]
>>492
コンパイル時に分かる事を実行時に判定するのは非効率だよ。

非効率どころかコンパイルが通らなくなることも多い。

499 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 16:55:59 ]
実行時に動的にクラスを作るような構造は駄目ということか



500 名前:デフォルトの名無しさん [2007/03/15(木) 17:07:09 ]
>499
誰もそんなこと言ってないが

501 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 17:08:16 ]
sage忘れてた…orz

502 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 18:08:05 ]
>>498
実用的なコンパイラなら最適化でif文をさっくりと消してくれる。

503 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 20:52:02 ]
C++でVisual studioの質問なんですけど、例えばabcdeをstringで引っ張ってきて
その文字数を整数に直す(この場合だと5)方法ってありますか?
別にstringを使わなくてもいいんですが・・・・

504 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 20:53:58 ]
size()
length()

505 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 20:55:49 ]
文字数を整数に直すの意味がわからん
整数じゃないのかよ元は

506 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 20:59:47 ]
ああ、lengthを忘れてました。
どうもありがとう。

507 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 21:00:14 ]
わからんぞ。>>503の世界ではマイナスかもしれんし、はたまた虚数かもしれん



508 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 21:05:31 ]
平行世界の住人でもOK
ただしその場合、質問者は必ず、出身地を書きましょう

509 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 21:28:27 ]
文字数を整数に直すっていうか、文字数を数えたかったんです。



510 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 21:56:27 ]
C++ VisualStudioで質問させていただきます

unsigned char * と System::String^ (#include<string.h>)
この二つをお互い変換する方法を教えていただきたいです

511 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 22:02:19 ]
support.microsoft.com/kb/311259/ja
マネージドC++向けの記事だが、たとえC++/CLIでも構文が違うだけで中身は通用する。

512 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 22:05:37 ]
またC++の質問なんですが、
abcde
という文字列があるとして、左から4番目・dを取り出すのはどうすればよいですか?

513 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 22:11:08 ]
c=s[3];

514 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 22:11:42 ]
ちゃんと出身地を明記しような。

515 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 22:14:33 ]
>>513
いまいちわからないのですが・・・

>>514
出身地?
一応東京ですけど・・・

もう少し詳しく教えて頂けませんか?
困ってるんです。

516 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 22:19:42 ]
困って2ch来て質問して、ズバリ回答を得てもなお食い下がるヤツってどうかしてると思う。
あとは検索でもして勉強しろよ。20分で理解できるだろ。

517 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 22:25:37 ]
>>516
>>513の c=s[3]; がズバリ答えなんですか?
C++って一文字で書かれているのを見たことがなかったので
なにか省略されてるのかと誤解してました。すいませんでした。

518 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 22:45:44 ]
>>502
それ以前にコンパイル通らなくなるときがあるって。

Modern C++ Designあたりに書いてなかったかな〜

519 名前:510 mailto:sage [2007/03/15(木) 23:03:33 ]
>>511
ありがとうございます
ページ見ながら色々勉強してみます



520 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 23:49:55 ]
>>495
>>496
ちょっと時間かかってしまいましたが、
文字コード変換できました!
まだ、あんまり理解できて無いですが
ネットで検索して勉強します。

どうもありがとうございました。
ほんと助かりました。

521 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 00:53:20 ]
>>518
もはやModernでもなんでもない本を持ち出してきてもらっても困る。
どういう時だ?

522 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 01:50:54 ]
もはやModernでもなんでもない定番本の説明なんかしなきゃいけないのか。

523 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 06:20:04 ]
>>489
遅いけどexじゃない方はハンドルを自動で閉じるのでWaitFor〜を使うべきではありません
すでに終了しているスレッドハンドルに対してWaitForSingleObject(hoge,INFINITE)
するとずっと戻ってこなかったりします
昔はまったことがあったんだけど今見てみたらMSDNにも書いてありますね

524 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 07:36:44 ]
>>521
例えば

T hoge;
if(isIHogesChild(T)){
hoge.fun1();
}else{
hoge.fun2();
}

Tにfun1,fun2の両方が定義されてないとコンパイルエラー

525 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 07:40:11 ]
それだったら部分特殊化したりenable_ifで切り替えたりすればいい。

526 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 08:35:42 ]
いや全くその通り。
普通ifは使わないでしょ。

527 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 08:49:39 ]
いや全くその通り。
普通ifは使わないでしょ。

528 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 09:22:12 ]
いや全くその通り。
普通ifは使わないでしょ。                                   nullpo

529 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 09:57:05 ]
[環境]C++Builder
hoge.iniみたいな、設定ファイルがないのに
exeファイルをクリックして再起動しても、設定値を
保持してるアプリケーションを、良く見かけますが
あれはどうやるのでしょうか。



530 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 10:45:20 ]
つ[レジストリ]

531 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 11:21:49 ]
Windowsフォルダにiniブッコミ

532 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 12:47:52 ]
>>530-531
レスありがとうございます。
インストールしてないソフトでも,設定値を保持しているので、
不思議だったんですが、そういう方法もあるんですね。

今は、自分で作るとき"hoge=hoge"(key=value)だけの形式でやっているので、
「getlineで一行ずつ読み込んで、std::map<std::string,std::string>に格納」
で簡単なんですが。

[hoge]
hoge=hoge
hoge=hoge
[hoge]
hoge=hoge
・・・
こういう設定ファイルの読み書きの方法解説してる
サイト無いでしょうか。
オープンソースのソフトなどのソース見て勉強しようと
思ってるんですが、ソースが膨大なのが多くて、
なかなか設定値の読み込んでる部分を、探し当てること出来ません。

([]の部分の名前,key値,value値)構造体に格納していくのかと思ったんですが、
読み込みも書き込みも、なんだか難しいです。

533 名前:532 mailto:sage [2007/03/16(金) 15:27:28 ]
532です。
struct inistruct{
char* section; //[]の値
std::map<std::string,std::string> map;
};

struct inistruct *p = new inistruct[length];
//iniファイルを読み込んで、pに格納

//もし、特定のsectionの値を取り出したい場合
for(int i=0;i< length;i++){
//もし、特定のsection="hoge"の値を参照したい場合
if(strcmp(p[i].section,"hoge")==0 ){
//p[i].mapから、値を取り出す
break;
}else{
continue;
}
}
こういう感じで、"読み取り"と"参照"できそうです。

あと、特定のsectionの中の値を一つ変更された場合の
設定ファイルに書き込む方法が、よくわかりません。
std::string str; //新しい設定ファイルの全文を格納
while(getline(fin,s)){
if(更新したいsectinじゃない or 更新したいmapじゃない){//ここもっと複雑かもです
str+=s;
}else{
str+="更新したい文字列";
}
}
こういう感じでしょうか。よろしくお願いします。

534 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 18:31:12 ]
>>533
msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpsysinf/html/_win32_getprivateprofilestring.asp

535 名前:532 mailto:sage [2007/03/16(金) 20:00:44 ]
>>534
GetPrivateProfileStringというキーワードで
いろいろと検索できそうです。
ピンときたので、作りかけのやつ完成させたいと思います。
どうもありがとうございました。

536 名前:デフォルトの名無しさん [2007/03/16(金) 23:47:52 ]
設定/初期化ファイルについて、便乗質問。
環境はWindows2000以降(ただし可能なら9x系も)、C++のネイティブアプリケーション。

(1) MSのサイトによると、iniファイルは使うなと書いてありますが
  少なくとも内部ツールや規模の小さなフリーウェア程度では、16ビット非対応でもまだiniファイル使っても問題ないのでしょうか?

(2) 最近はレジストリよりも、XML設定ファイルが普及しつつある気もしますが、
  検索してもC#や.NET Framework向けの説明ばかりで、C++のネイティブアプリ向けの説明が見つかりません。
  何か良さげなテキストを知ってたらお願いします。

537 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 23:54:53 ]
VistaではProgramFiles以下には書けないので。
すくなくとも、exeと同じパスにiniを書くようなアプリを今から作るのはどーかなー。

538 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 23:56:54 ]
インストールフォルダを変えれば良いだけやん

539 名前:536 mailto:sage [2007/03/17(土) 00:08:44 ]
>Program Files以下
マジっすか…。
既存プログラムのアドオンとかも考えていたのですが、それだと今あるソースを変更しないとダメですね……。



540 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 00:11:51 ]
ぶっちゃけC++でXML読み書きツライ。

541 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 01:17:00 ]
じゃあ、やりやすい言語でXMLパーサーのラッパーライブラリ作って、C++からインポートすりゃいいじゃん。







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<200KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef