- くだすれC++/CLI(初心者用)part2
920 :デフォルトの名無しさん[sage]:2015/09/15(火) 21:43:10.94 ID:sv5Bl9TI - 質問です。
上手いことsscanfを.NETで実装する方法ってありますか? ポインタが上手く渡せず困っています。 なお、正式に習ったわけではなく、見よう見まねでやっているため、 単純なところで勘違いがあるかもしれませんが、その時も指摘して頂けたら助かります。
| - くだすれC++/CLI(初心者用)part2
921 :デフォルトの名無しさん[sage]:2015/09/15(火) 21:43:39.42 ID:sv5Bl9TI - 【これまでの経緯】
プログラムが間延びしてきたため、 これまで個別にちまちま書いていたファイル読み出し部分をsscanfで纏めて整理しようとしています。 ググッたところ、.NETにはsscanfそのものはなく、どうやら皆さん苦労しているようでした。 http://stackoverflow.com/questions/4223917/c-sharp-equivalent-of-c-sscanf http://stackoverflow.com/questions/492262/is-there-an-equivalent-to-sscanf-in-net http://www.blackbeltcoder.com/Articles/strings/a-sscanf-replacement-for-net ただ自分の場合はcsvの読み出しで順番と対象だけ指定できればいいので、 以下のように組んでみました。(ただしまだ動かしていないので動かないかもしれません) private: int sscanf_csv(String^ str, String^ format, array<void**>^ pointers){ array<String^>^ strs = str->Split(','); array<String^>^ fmts = format->Split(','); int i=0; while (i<strs->Length && i<fmts->Length) { if (fmts[i]=="int") { if (!Int32::TryParse(strs[i],(int%)pointers[i])) break; } else if (fmts[i]=="double") { if (!Double::TryParse(strs[i],(double%)pointers[i])) break; } else if (fmts[i]=="float") { if (!Single::TryParse(strs[i],(float%)pointers[i])) break; } else if (fmts[i]=="string") { *(interior_ptr<String^>)pointers[i] = strs[i]; } i++; } return i; } Stringのところは怪しいですが、intとdoubleとfloatはネイティブなら問題ないと思っています。
| - くだすれC++/CLI(初心者用)part2
922 :デフォルトの名無しさん[sage]:2015/09/15(火) 21:44:06.10 ID:sv5Bl9TI - 【問題点】
・マネージドのクラスではメンバにネイティブ配列が使えないため、 書き込み対象にどうしてもマネージド配列の要素を指定することが必要となりますが、 interior_ptrをvoid**にキャストできません。 仕様上、interior_ptr → pin_ptr → int → void** にはキャストできる(っぽい)のですが、 ・interior_ptrは配列に出来ない(array<interior_ptr<int>> も interior_ptr<int> hoge[] もエラー) ・pin_ptrも同様に配列に出来ない。さらにローカル変数として宣言しないと駄目っぽい。 ため、これらを回避するためにはベタにコードする必要があり、余計に見にくくなります。 ・そもそも void** にしているのは可変長引数がいまいちだったからなのですが、 上記のように interior_ptr が配列に取れないから多分可変長も無理です。 ・自分の場合は1行につきせいぜい10個程度の代入なので最悪べた書きでラップしてもいいのですが、 interior_ptr<Type>は型指定があり、型の順番は変更したいのでこれも厳しいです。 【出来ればいいなと思っている記述】 array<int> ary_int = gcnew array<int>(10); array<double> ary_double = gcnew array<double>(10); sscanf_csv(line0, "int,double", gcnew array<void**>(2){&ary_int[0], &ary_double[0]}); sscanf_csv(line1, "double,int", gcnew array<void**>(2){&ary_double[1], &ary_int[1]}); という感じです。良い案があればお願い致します。
|
|