C言語のCUIプログラムで一度に複数の変換を行う方法は?
- C言語のCUIプログラムで作成されたexeにファイルをドラッグして変換をする際、一度に複数のファイルを変換する方法が知りたいです。
- 現在、作成したexeには1つのファイルをドラッグすることでしか変換できず、400ファイルを個別に変換するのは手間です。
- もし複数のファイルを選択して一度のドラッグで変換する方法があれば教えてください。
- ベストアンサー
CUIプログラムにドラッグして1度に複数の変換は?
みなさま、こんにちは。 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へのドラッグで変換出来ないものでしょうか? もしくは違った方法がありますでしょうか? どなたかお分かりになりましたら、ご教示願えないでしょうか? お手数をおかけ致しますが、よろしくお願いいたします。
- shoshin01
- お礼率85% (141/164)
- C・C++・C#
- 回答数6
- ありがとう数7
- みんなの回答 (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% (2177/4070)
>あの、私の言いたいことに分かりにくい点があり申し訳ございません。 >複数のファイルの中身を変換するために複数のファイル名をプログラムに渡したいのですが、可能でしょうか? 掲示されたプログラムを実行した上でおっしゃっているハズですので…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/6970)
>複数のファイル名をプログラムに渡したいのですが、可能でしょうか? 渡っています。 2つのファイルをドラッグすると argcに2が入り、argv[0]に1つ目のファイル、argv[1]に2つ目のファイル名が入ります。 forループで回っていますので、 この中でファイルをオープンして必要な変換を行ってください。
お礼
maiko0318さん、 ありがとうございました。私の勘違いでした。申し訳ないです。
- f272
- ベストアンサー率46% (8012/17125)
#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
- main(int argc,char **argv[])の意味を教えて下さい
今晩は、Cの初心者です宜しくお願いします。 main関数の引数で、int main(int argc,char **argv[])とint main(int argc,char *argv[])と書かれている場合がありますが、 「**argv」と「*argv」の意味の違いはどのようなもので、どのように使い分けるのでしょうか。 また、必ずポインタ型でとるという決まりでしょうか。 宜しくお願いします。
- 締切済み
- C・C++・C#
- main の引数には const 付けた方が
C言語での質問です。 引数を取るような main 関数は int main( int argc, char *argv[]){~} とされていますが、argvの指す文字列を変更する、というのはいくら何でもまずいので、 int main( int argc, const char *argv[]){~} あるいは int main( int argc, const char const * const * argv){~} の方がいいのではないでしょうか? 何故、constを付けない形が出回っているのでしょうか?
- ベストアンサー
- C・C++・C#
- ファイルコピープログラムについて
まだC言語とか始めたばかりであまりよく分からないのですが、 今、ドラッグしたファイルをデスクトップにコピーするプログラムを作成してるのですが、少し困ったことになりました・・・・ 一応ファイルのコピーをデスクトップに作成はできるのですが、 何故か、作成されたファイルのサイズが2バイト程大きくなります・・・。 ファイルサイズを変えずにコピーする方法が分かりません・・・ ソースを張っておきますので、誰か解決策を教えていただけないでしょうか? #include <stdio.h> #include <windows.h> int main(int argc,char *argv[]) { FILE *fp,*copy; int buf; if(argc>1){ rename(argv[1],"DATA.bin"); fp=fopen("DATA.bin","rb"); copy=fopen("c:/xxx/yyy/Desktop/COPY.bin","wb"); while(1){ fread(&buf,sizeof(buf),1,fp); fwrite(&buf,sizeof(buf),1,copy); if(feof(fp)){ puts("OK"); fclose(fp); fclose(copy); rename("DATA.bin",argv[1]); rename("COPY.bin",argv[1]); exit(1); } } } return 0; }
- ベストアンサー
- C・C++・C#
- C言語 複数指定したファイルの内容表示
C言語の質問です。 「実行したファイル名を除いたコマンド ライン引数に、 複数個指定したすべてのファイルの内容を標準出力に表示する」 というプログラムを作成しようと思うのですが。。。 どうしても上手くいきません。 1つのファイルの内容を標準出力に表示するプログラムになってしまいます。 どなたかお力を貸してください。 ちなみに、私が作成したプログラムは、以下です。↓↓ #include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; int c; if(argc != 2) { return 1; } if((fp=fopen(argv[1], "r"))==NULL) { return 1; } while((c=fgetc(fp)) !=EOF) { fputc(c, stdout); } fclose(fp); return 0; }
- 締切済み
- C・C++・C#
- ショートカットファイルのリンク先がほしい
void main(int argc,char *argv[]) { ....... fp=fopen(argv[1],"w+"); ....... } によってexeファイルをつくり このexeファイルにショートカットファイルをドラッグしてのショートカットフィルのリンク先ファイルを操作したいのですが argv[1]にはショートカットファイルのリンク先のファイルパスが入らずに ショートカットファイル(.LNK)自身のパスが入ってしまうために リンク先ファイルを操作できません どのようにしてプログラム上でリンク先パスを得ることができますか?
- ベストアンサー
- C・C++・C#
- C言語でコマンドラインの引数について。
コマンドラインで引数をわたす基本的なプログラムは main(int argc,char *argv[]){....] ですよね。 今回実行時に、 >実行ファイル名 123 + 233 といれたら、123+233を計算してくれるプログラムを作ろうとしています。 その場合、main(int argc,int *argv[]){} としたら、argv[1]に123が入って、argv[2]に+が入って、argv[3]に233が、入るというわけではないんでしょうか? とりあえず、確認で #include<stdio.h> main(int argc,int *argv[]) { printf("%d\n%d\n",argv[1],argv[3]); } としてみたんですが、実行結果は、とても長い数字がでてきてきました。 なにがいけないのか教えてください。 お願いします。 あとWindows MEでVC++6を使ってます。
- ベストアンサー
- C・C++・C#
- 関数の引数の書き方。
AとBのどちらの書き方でもよいのですか? 私が読んだ本(やさしいC)には、 Aパターンのみだったような? Aパターン ------------------ void main(int argc,char *argv[]) { int i; ・・・・ } Bパターン ------------------ void main(argc, argv) int argc; char *argv[]; { int i; ・・・・ } http://ash.jp/db/ora_c.htm
- ベストアンサー
- C・C++・C#
- 【C】引数の変換をする場合どちらの方法を使うべきでしょうか?
int main(int argc, char* argv[]) { int i; /* argv[1]をintになおして格納用 */ 処理 } という感じでメインを作ると思いますが 引数のargv[0]はファイルの絶対パス argv[1]には"必ず"数字(整数)が入っていると仮定して argv[1]をint型に変換する場合 (1) sscanf(argv[1], "%d", &i); とするか (2) stdlib.hをインクルードして i = atoi(argv[1]); とするかの二通りをとりあえず思いついたのですが どちらもintに変換された値が入るわけですが C言語になれておられる方なら普通どちらをつかいますか? (1)or(2) 又はそれ以外の方法、どっちでも良し、場合によるetc... ご意見よろしくお願いします。
- ベストアンサー
- C・C++・C#
- Win環境においてドラッグに対応
Windows環境でC言語のプログラミングをしております。 main関数の引数、ファイルの入出力に関する質問になります。 ★実行環境 コンパイラ:MinGW(GNU GCCコンパイラ) OS:Windows XP Professional ★やりたい事 データファイルをEXEファイルにドラッグして、そのファイルの中身を読み込み 読み込んだデータを利用してファイルを出力。 ★出力結果イメージ 文字列「123456789」が一行に入力されているテキストデータ「data.txt」を、 作成した「io.c」をコンパイルしてできた実行ファイル「io.exe」にドラッグし、 ドラッグされたファイル名をmain引数で受け取り、 そのファイルを読み込み下記のような内容のテキストファイル「output.txt」を作成する。 ----- 1 ----- (中略) ----- 9 ----- ★現在のソース(エラー処理等省略) #include <stdio.h> #define MAX 100 int main(int argc,char *argv[]) { FILE *in; FILE *out; char data[MAX]; int i; if((in = fopen(argv[1],"r")) == NULL) { return 0; } if((out = fopen("output.txt","w")) == NULL) { return 0; } fgets(data,MAX,in); for(i = 0;data[i] != '\0';i++) { fprintf(out,"----- %c -----\n",data[i]); } fclose(in); fclose(out); return 0; } ★問題点 コマンドプロンプトで「io.exe data.txt」と入力すると問題無くexeのカレントディレクトリに「output.txt」ができ、 中身も求めているデータなのですが、Windows上で data.txtを直接マウスでio.exeにドラッグすると、output.txtが出力されません。 実際にargv[1]には正常にファイル名のフルパスが入っており、 argv[1]を使用してファイルの内容を読み取る事に成功しています。 しかし、ドラッグした場合のみfprintfが求めている結果を返してくれません。 この原因、および対策方法をご教授頂ければと思います。 よろしくお願い致します。
- ベストアンサー
- C・C++・C#
お礼
Wr5さん、 ご回答ありがとうございます。早とちりでした。申し訳ございませんでした。