アプリ版:「スタンプのみでお礼する」機能のリリースについて

みなさま、こんにちは。

Visual c++2010Express-Cを用いて、C言語のプログラムを作成しています。CUIのプログラムで、作成されたexeにファイルをドラッグしてファイルの変換をするプログラムです。

main.c の始まりは

int main(int argc, char *argv[])

です。

ココで問題があるのですが、作成されたexeには1つのファイルをドラッグすることでしか変換出来ない、つまり1度のドラッグで1つのファイルしか変換出来ません。
現在、400ファイル程あるのですが、400回もドラッグをするのは果てしなく苦痛です。

int main(int argc, char *argv[])
上記を変更して、複数のファイルを選択して1度のexeへのドラッグで変換出来ないものでしょうか?

もしくは違った方法がありますでしょうか?

どなたかお分かりになりましたら、ご教示願えないでしょうか?

お手数をおかけ致しますが、よろしくお願いいたします。

A 回答 (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から回してください。
    • good
    • 0

>あの、私の言いたいことに分かりにくい点があり申し訳ございません。


>複数のファイルの中身を変換するために複数のファイル名をプログラムに渡したいのですが、可能でしょうか?

掲示されたプログラムを実行した上でおっしゃっているハズですので…OSの設定が変更されている可能性が高いと思われます。
なんらかのウイルスなどに感染していたりするのではありませんか?

Windows7では
コントロール パネル\すべてのコントロール パネル項目\既定のプログラム\関連付けを設定する
で拡張子exeの関連付けは確認…できませんな。
WindowsXPの時には確認できたような記憶があるんですが……
そこでコマンドライン引数とか設定できたかと…。

>2つのファイルをドラッグすると
>argcに2が入り、argv[0]に1つ目のファイル、argv[1]に2つ目のファイル名が入ります。

argv[0]はプログラムファイル自身のファイル名だったハズですが…。
フルパスで入っているかどうかは環境依存だったかも知れませんけど。


バッチファイル経由で処理する。
という方法もあるでしょう。
http://inscrutable.seesaa.net/article/292718229. …

exeファイルのアイコンへのドラッグ&ドロップで複数のファイル名を渡せない設定に書き換えられていても、
バッチファイルへのドラッグ&ドロップの設定までは変更されていないと思われますし。
まぁ、されていたら面倒ですけどね…。
WindowsXPのPowerToysにはファイルのパス名をクリップボードにコピーする。というのがありましたが…。
同様のフリーソフトはあると思われますので、ファイル名をクリップボードに取り込んだ後で、
テキストエディタに貼り付けてプログラムを呼び出すバッチファイルを作成することになるでしょうか。
ドラッグ&ドロップでお気軽に。というワケにはいきませんが400個も個別にドラッグ&ドロップするよりはマシでしょう。


コマンドライン引数の最大文字数ってどっかに書かれていましたっけねぇ…。
http://0xc000013a.blog96.fc2.com/blog-entry-186. …
……あんましファイル数が多いとコケるかも知れませんな。
main()の引数で受け取るってコトはCランタイムライブラリ側での制限もあるハズですし。
    • good
    • 0
この回答へのお礼

Wr5さん、

ご回答ありがとうございます。早とちりでした。申し訳ございませんでした。

お礼日時:2014/02/08 14:33

追記:


argv[0] には、 実行プログラム名(通常は、実行ファイル名) が入ります。
コマンドライン引数の1つ目は argv[1] です。
    • good
    • 0

確認なのですが


あなたの作ったプログラムは、どんな仕様になっているのですか?

コマンドプロンプトから
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の出力をテキストエディタで置換すれば簡単
等もあります
    • good
    • 0
この回答へのお礼

kmeeさん、

ありがとうございます。

>DIRの出力をテキストエディタで置換すれば簡単
頭にありませんでした。目から鱗、ありがとうございました!

お礼日時:2014/02/08 14:31

>複数のファイル名をプログラムに渡したいのですが、可能でしょうか?



渡っています。
2つのファイルをドラッグすると
argcに2が入り、argv[0]に1つ目のファイル、argv[1]に2つ目のファイル名が入ります。

forループで回っていますので、
この中でファイルをオープンして必要な変換を行ってください。
    • good
    • 0
この回答へのお礼

maiko0318さん、

ありがとうございました。私の勘違いでした。申し訳ないです。

お礼日時:2014/02/08 14:27

#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さん、ありがとうございます。

あの、私の言いたいことに分かりにくい点があり申し訳ございません。
複数のファイルの中身を変換するために複数のファイル名をプログラムに渡したいのですが、可能でしょうか?

補足日時:2014/02/08 05:27
    • good
    • 0
この回答へのお礼

すみません。合っていたのですね。ありがとうございました。

お礼日時:2014/02/08 14:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!