- ベストアンサー
C言語のCUIプログラムで一度に複数の変換を行う方法は?
- C言語のCUIプログラムで作成されたexeにファイルをドラッグして変換をする際、一度に複数のファイルを変換する方法が知りたいです。
- 現在、作成したexeには1つのファイルをドラッグすることでしか変換できず、400ファイルを個別に変換するのは手間です。
- もし複数のファイルを選択して一度のドラッグで変換する方法があれば教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>>2つのファイルをドラッグすると >>argcに2が入り、argv[0]に1つ目のファイル、argv[1]に2つ目のファイル名が入ります。 >argv[0]はプログラムファイル自身のファイル名だったハズですが…。 見落としました。おっしゃるようにargv[0]はプログラムファイル自身のファイル名でした。 なので、argv[1]に1つ目のファイル、argv[2]に2つ目のファイル名が入ります。 ということで for (i = 0; i < argc; i++) のループは0からでなく、1から回してください。
その他の回答 (5)
- Wr5
- ベストアンサー率53% (2173/4061)
>あの、私の言いたいことに分かりにくい点があり申し訳ございません。 >複数のファイルの中身を変換するために複数のファイル名をプログラムに渡したいのですが、可能でしょうか? 掲示されたプログラムを実行した上でおっしゃっているハズですので…OSの設定が変更されている可能性が高いと思われます。 なんらかのウイルスなどに感染していたりするのではありませんか? Windows7では コントロール パネル\すべてのコントロール パネル項目\既定のプログラム\関連付けを設定する で拡張子exeの関連付けは確認…できませんな。 WindowsXPの時には確認できたような記憶があるんですが…… そこでコマンドライン引数とか設定できたかと…。 >2つのファイルをドラッグすると >argcに2が入り、argv[0]に1つ目のファイル、argv[1]に2つ目のファイル名が入ります。 argv[0]はプログラムファイル自身のファイル名だったハズですが…。 フルパスで入っているかどうかは環境依存だったかも知れませんけど。 バッチファイル経由で処理する。 という方法もあるでしょう。 http://inscrutable.seesaa.net/article/292718229.html exeファイルのアイコンへのドラッグ&ドロップで複数のファイル名を渡せない設定に書き換えられていても、 バッチファイルへのドラッグ&ドロップの設定までは変更されていないと思われますし。 まぁ、されていたら面倒ですけどね…。 WindowsXPのPowerToysにはファイルのパス名をクリップボードにコピーする。というのがありましたが…。 同様のフリーソフトはあると思われますので、ファイル名をクリップボードに取り込んだ後で、 テキストエディタに貼り付けてプログラムを呼び出すバッチファイルを作成することになるでしょうか。 ドラッグ&ドロップでお気軽に。というワケにはいきませんが400個も個別にドラッグ&ドロップするよりはマシでしょう。 コマンドライン引数の最大文字数ってどっかに書かれていましたっけねぇ…。 http://0xc000013a.blog96.fc2.com/blog-entry-186.html ……あんましファイル数が多いとコケるかも知れませんな。 main()の引数で受け取るってコトはCランタイムライブラリ側での制限もあるハズですし。
- kmee
- ベストアンサー率55% (1857/3366)
追記: argv[0] には、 実行プログラム名(通常は、実行ファイル名) が入ります。 コマンドライン引数の1つ目は argv[1] です。
- kmee
- ベストアンサー率55% (1857/3366)
確認なのですが あなたの作ったプログラムは、どんな仕様になっているのですか? コマンドプロンプトから command fileA と実行したら ・fileAが変換されて FILEB(固定名) に出力 ・fileAが変換されて fileA.new(入力毎に違う名前) に出力 ・fileAが変換されて 元のfileAに出力 ・その他の動作 のどれなのですか? command fileA fileB と実行したら ・fileAが変換されて fileB に出力 ・fileAが変換されて FILEB(固定名) に出力,fileBは無視される ・fileAが変換されて fileA.new(入力毎に違う名前) に出力,fileBは無視される ・fileAが変換されて fileA.new(入力毎に違う名前) に出力,fileBが変換されて fileB.new(入力毎に違う名前) に出力 ・fileAが変換されて 元のfileAに出力,fileBは無視される ・fileAが変換されて 元のfileAに出力,fileBが変換されて 元のfileBに出力 ・その他の動作 のどれなのですか? おそらく command fileA fileB と実行したら ・fileAが変換されて FILEB(固定名) に出力,fileBは無視される ・fileAが変換されて fileA.new(入力毎に違う名前) に出力,fileBは無視される ・fileAが変換されて 元のfileAに出力,fileBは無視される のいずれか というプログラムではないですか? 入力ファイルとして argv[1] しか見ていないのでは。 ドラッグ&ドロップで複数ファイルを処理させたい、というのなら command fileA fileB と実行したら ・fileAが変換されて fileA.new(入力毎に違う名前) に出力,fileBが変換されて fileB.new(入力毎に違う名前) に出力 ・fileAが変換されて 元のfileAに出力,fileBが変換されて 元のfileBに出力 のいずれか というプログラムに変更する必要があります。 #1でargvの全ての項目を表示させているように。 プログラムを変更したら、ドラッグ&ドロップで command fileA command fileB と実行してくれる、と思っているのなら、それは間違いです。 別解として ・「ドラッグ&ドロップしたら、『command fileA』『command fileB』...と順番に実行するプログラム」を別に用意する。 BATやVBScriptでも作れます。 ・『command fileA』『command fileB』... と実行するコマンドを並べたBATファイルを作って実行 DIRの出力をテキストエディタで置換すれば簡単 等もあります
お礼
kmeeさん、 ありがとうございます。 >DIRの出力をテキストエディタで置換すれば簡単 頭にありませんでした。目から鱗、ありがとうございました!
- maiko0318
- ベストアンサー率21% (1483/6969)
>複数のファイル名をプログラムに渡したいのですが、可能でしょうか? 渡っています。 2つのファイルをドラッグすると argcに2が入り、argv[0]に1つ目のファイル、argv[1]に2つ目のファイル名が入ります。 forループで回っていますので、 この中でファイルをオープンして必要な変換を行ってください。
お礼
maiko0318さん、 ありがとうございました。私の勘違いでした。申し訳ないです。
- f272
- ベストアンサー率46% (8529/18257)
#include <stdio.h> #include <string.h> int main(int argc, char**argv) { int i; int len = 0; for (i = 0; i < argc; i++) { printf("%s\n", argv[i]); len += strlen(argv[i]); } printf("argc = %d len = %d\n", argc, len); getchar(); return 0; } こんな感じ。ただし最大の文字数以上を引き渡すと切られる。
お礼
すみません。合っていたのですね。ありがとうございました。
補足
f272さん、ありがとうございます。 あの、私の言いたいことに分かりにくい点があり申し訳ございません。 複数のファイルの中身を変換するために複数のファイル名をプログラムに渡したいのですが、可能でしょうか?
お礼
Wr5さん、 ご回答ありがとうございます。早とちりでした。申し訳ございませんでした。