main関数のコマンドライン引数の上限?
実験のデータ整理のために50個くらいのテキストデータを処理するプログラムを作ったつもりなのですが
main(int argc, char *argv[])
の*arg[]のところに30個以上の引数を持っていけません。
ドラッグ&ドロップで、プログラムにデータを持っていこうとすると
「指定されたデバイス、バス、またはファイルにアクセスできません。アクセス許可がない可能性がありません。」
という警告メッセージがでます。
何か方法はないでしょうか?
回答(4件)
- 最新から表示
- |
- 回答順に表示
- |
- ベストアンサーのみ表示
No.4ベストアンサー20pt
★過去にも同様な質問がありましたよ。
>の*arg[]のところに30個以上の引数を持っていけません。
↑
私の環境では25個前後です。
>ドラッグ&ドロップで、プログラムにデータを持っていこうとすると
>「指定されたデバイス、バス、またはファイルにアクセスできません。アクセス許可がない可能性がありません。」
>という警告メッセージがでます。
↑
OSの制限によるものだと思います。
>何か方法はないでしょうか?
↑
エクスプローラからファイルを選択したら右メニューより『コピー(C)』を選択します。
その後にプログラムからクリップボードの HDROP ハンドルを取得すれば選択された
すべてのファイルパスを取得できます。この方法ならドラッグ&ドロップしないで
プログラムを起動すれば良いので argc、argv は不要になります。
・まずは過去質問を読んでみて下さい。
http://oshiete1.goo.ne.jp/qa3222390.html→『コンソールアプリの起動パラメータ について』
このリンクの回答 No.4 に文字数の確認用のサンプルを載せています。
ドラッグ&ドロップしたときはフルパス名で 2100 バイトまで受け取れるようです。
よって1つのファイルのパスが深いとあまり多くのファイルを渡せません。
逆にルートのパス(C:\)なら100個以上のファイルをドラッグ&ドロップで渡せます。
・以上。ファイルの受け渡しインタフェースを考え直してみましょう。
この回答へのお礼
親切な解答ありがとうございます。
過去の質問もよく読み返しておきます。
No.3ベストアンサー10pt
引数は「ファイル名のみ」ですか?「パス+ファイル名」ですか?
また、途中に空白を含むものがあるとか。
試しに引数ひとつひとつをダブルクォーテーションで囲んでみるのはどうでしょう?
例)
C:\My Documens and Settings\Text31.txt C:\(以下 略)
"C:\My Documens and Settings\Text31.txt" "C:\(以下 略)"
のように。
この回答への補足
「パス+ファイル名」です。
1つ1つのファイルではうまく出力できるので、やはり何かの上限に引っかかっているように思われます。
OSは何でしょう?
プログラムの制限ではなく、OSのコマンドラインの文字数制限に引っかかっているのではないでしょうか?
この回答への補足
XPです。
文字数制限とはANO.1のSAYKAさんのURLにある
ファイル名: 255 文字
フルパス名: 約 32,000 文字
コマンドライン引数: 32,767 文字
でしょうか?
コマンドライン引数の32,767 文字というのが何の文字数かよくわかりませんが、
いろいろのテキストデータで試したのですがきっちり30個でエラーがでます。
この回答へのお礼
今実験したところ、
テキストデータ、約50個をC:\の直下に持っていってそこから引数にしたら今度はエラーが出ずに成功しました。
フルパス名の上限に引っかかっていたようです。
すいません、ファイルの場所が悪かったみたいです。
探したらそれっぽいの発見
http://okwave.jp/qa1769174.html
ワイルドカードとか独自解析を作成するのが近道だと思うよ
この回答へのお礼
ありがとうございます。
1つうえでも書きましたが、ファイル名やパスの上限ではないと思います。
コマンドライン引数: 32,767 文字
というのがよくわかりませんが、これに引っかかっている可能性がありそうなので、調べてみます。
- 最新から表示
- |
- 回答順に表示
- |
- ベストアンサーのみ表示












