• ベストアンサー

空白を含む名前のファイル等を

受け取るプログラムで ”x y.txt”が一つのファイルと見なされるようにするため yoppiiさんに GetCommandLine() を使うのをやめて __argvや__argc すればいいという事を教えてもらいいったん解決したのですが いろいろ調べてみるとまずい場合がまだあるということがわかりました Windows95のc:\My documをドラッグ実行した場合です 試験用アプリは #include <windows.h> #include <string> using namespace std; WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int) { string str=""; for(int i=0;i<__argc;str=str+'<'+__argv[i++]+">\n"); MessageBox(NULL,str.c_str(),"Command",MB_OK); return 0; } です 対処方法を教えてください

質問者が選んだベストアンサー

  • ベストアンサー
  • gimmick
  • ベストアンサー率49% (134/270)
回答No.2

コマンドライン文字列を自力で解析したらよいのでは? ファイル名がフルパスで渡されるのなら、各ファイル名の始まりは"C:"や"D:"のようにドライブ名になります。 #ネットワークファイルの場合は"\\"で始まってるかもしれない。(自信なし)

nubou
質問者

お礼

そうですね 最後の手段にとっておきます 参考に次のアプリを考えたのですが空白が2回続くと__argvを使うやり方は破綻しますね #include <windows.h> #include <string> #include <list> using namespace std; WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int) { list<string> L; list<string>::iterator p,q; string str=""; for(int i=0;i<__argc;L.push_back(__argv[i++])); p=++(q=L.begin()); while(p!=L.end()) { if(p->find(':')==p->npos) { *q+=' '+*p;p=L.erase(p); } else q=p++; } for(p=L.begin();p!=L.end();str+='<'+*(p++)+">\n"); MessageBox(NULL,str.c_str(),"Command",MB_OK); return 0; } ありがとうございました

nubou
質問者

補足

結局最後の手段に頼ることになってしまいました しかしお礼で書いたように__argvは使用できません GetCommandLineを使うしか今のところ情報がありません しかしこれのフォーマットが新しい質問で書いたものかどうかわかりません 今は98SEと95ですがOSを更新したら動かなくなるプログラムは作りたくないのです そこでもしお分かりならば新しい質問に回答していただければ幸いなのですが よろしくお願いします

その他の回答 (1)

回答No.1

> いろいろ調べてみるとまずい場合がまだあるということがわかりました > Windows95のc:\My documをドラッグ実行した場合です なにがどうまずいか説明してください。

nubou
質問者

補足

素早い回答ありがとうございます Windows95で ディレクトリ"c:\My docum"を 質問のプログラムにドラッグ実行すると メッセージボックスに <c:\My docum> と表示したいのに <c:\My> <docum> と表示されてしまい一つのディレクトリが2つのディレクトリと見なされるのです 98だとMy documがMydocu~2に変換され事なきを得るのです しかし98でもいつも事なきを得るかどうかはいろいろ試してみないとわかりません 古い95マシンも持っていて使いたいのでどうしてもなおしたいのです よろしくお願いします

関連するQ&A