

みなさま、こんにちは。
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へのドラッグで変換出来ないものでしょうか?
もしくは違った方法がありますでしょうか?
どなたかお分かりになりましたら、ご教示願えないでしょうか?
お手数をおかけ致しますが、よろしくお願いいたします。
No.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から回してください。
No.5
- 回答日時:
>あの、私の言いたいことに分かりにくい点があり申し訳ございません。
>複数のファイルの中身を変換するために複数のファイル名をプログラムに渡したいのですが、可能でしょうか?
掲示されたプログラムを実行した上でおっしゃっているハズですので…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ランタイムライブラリ側での制限もあるハズですし。
No.3
- 回答日時:
確認なのですが
あなたの作ったプログラムは、どんな仕様になっているのですか?
コマンドプロンプトから
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の出力をテキストエディタで置換すれば簡単
頭にありませんでした。目から鱗、ありがとうございました!
No.1
- 回答日時:
#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さん、ありがとうございます。
あの、私の言いたいことに分かりにくい点があり申し訳ございません。
複数のファイルの中身を変換するために複数のファイル名をプログラムに渡したいのですが、可能でしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 3 2022/10/04 15:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミングについて。 1つ...
-
gccを行ってもexeファイルが生...
-
c言語
-
visual studio 2022でのC#プロ...
-
C# DatagridviewにExcelシート...
-
mallocについて
-
C言語って古いですか?
-
C言語関数違いについて。
-
逆コンパイルと逆アセンブルの...
-
プログラムの実行時に'<'でリダ...
-
パソコン
-
CPUが16bitでも32bitOSでコンパ...
-
Python、プログラミングについ...
-
だれがとけるの?
-
バッチファイルで以下のような...
-
Notepad++の関数リスト表示の変...
-
VisualStudio2022でC言語プログ...
-
License='MIT' ってなんでmitな...
-
C言語 ストリームについて。
-
c言語でイベントフラグを使った...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語
-
gccを行ってもexeファイルが生...
-
大量のデータを読み込んで表示...
-
visual studio 2022でのC#プロ...
-
C++でデスクトップGUIアプリ開...
-
【C言語】全角文字の配列を、全...
-
Windows Formアプリからコンソ...
-
VisualStudio2022でC言語プログ...
-
C#でログファイルにファイルパ...
-
C#でTreeViewのCheckBoxのサイ...
-
c#のTLS1.2での通信について
-
VisualStudioでC++クラスを追加...
-
C言語について。
-
int16_t の _t は何?
-
プログラマー達は何故、プログ...
-
逆コンパイルと逆アセンブルの...
-
C言語の関数のextern宣言
-
c言語でイベントフラグを使った...
-
C言語 関数、変数の宣言について
-
[C言語]fputsとfprintfの違い
おすすめ情報