C言語のCUIプログラムで一度に複数の変換を行う方法は?

このQ&Aのポイント
  • 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へのドラッグで変換出来ないものでしょうか? もしくは違った方法がありますでしょうか? どなたかお分かりになりましたら、ご教示願えないでしょうか? お手数をおかけ致しますが、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答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から回してください。

その他の回答 (5)

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.5

>あの、私の言いたいことに分かりにくい点があり申し訳ございません。 >複数のファイルの中身を変換するために複数のファイル名をプログラムに渡したいのですが、可能でしょうか? 掲示されたプログラムを実行した上でおっしゃっているハズですので…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ランタイムライブラリ側での制限もあるハズですし。

shoshin01
質問者

お礼

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

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

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

  • kmee
  • ベストアンサー率55% (1857/3366)
回答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の出力をテキストエディタで置換すれば簡単 等もあります

shoshin01
質問者

お礼

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

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.2

>複数のファイル名をプログラムに渡したいのですが、可能でしょうか? 渡っています。 2つのファイルをドラッグすると argcに2が入り、argv[0]に1つ目のファイル、argv[1]に2つ目のファイル名が入ります。 forループで回っていますので、 この中でファイルをオープンして必要な変換を行ってください。

shoshin01
質問者

お礼

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

  • f272
  • ベストアンサー率46% (8012/17125)
回答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; } こんな感じ。ただし最大の文字数以上を引き渡すと切られる。

shoshin01
質問者

お礼

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

shoshin01
質問者

補足

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

関連するQ&A

  • main(int argc,char **argv[])の意味を教えて下さい

     今晩は、Cの初心者です宜しくお願いします。  main関数の引数で、int main(int argc,char **argv[])とint main(int argc,char *argv[])と書かれている場合がありますが、 「**argv」と「*argv」の意味の違いはどのようなもので、どのように使い分けるのでしょうか。 また、必ずポインタ型でとるという決まりでしょうか。 宜しくお願いします。

  • 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言語とか始めたばかりであまりよく分からないのですが、 今、ドラッグしたファイルをデスクトップにコピーするプログラムを作成してるのですが、少し困ったことになりました・・・・ 一応ファイルのコピーをデスクトップに作成はできるのですが、 何故か、作成されたファイルのサイズが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言語の質問です。 「実行したファイル名を除いたコマンド ライン引数に、 複数個指定したすべてのファイルの内容を標準出力に表示する」 というプログラムを作成しようと思うのですが。。。 どうしても上手くいきません。 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; }

  • ショートカットファイルのリンク先がほしい

    void main(int argc,char *argv[]) { ....... fp=fopen(argv[1],"w+"); ....... } によってexeファイルをつくり このexeファイルにショートカットファイルをドラッグしてのショートカットフィルのリンク先ファイルを操作したいのですが argv[1]にはショートカットファイルのリンク先のファイルパスが入らずに ショートカットファイル(.LNK)自身のパスが入ってしまうために リンク先ファイルを操作できません どのようにしてプログラム上でリンク先パスを得ることができますか?

  • 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を使ってます。

  • 関数の引数の書き方。

    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

  • 四則演算プログラム

    2つの数字を四則演算するプログラムを作ろうと 思っているんですが、 (1)関数atoiを使う、 (2)int main(int argc, char +argv[])と  宣言する、 (3)足し算の場合のみ、2つ以上の数字を計算できる ということが条件なんですけど、どなたか プログラムがどのようなものか教えていただけ ませんか??

  • 【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... ご意見よろしくお願いします。

  • 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が求めている結果を返してくれません。 この原因、および対策方法をご教授頂ければと思います。 よろしくお願い致します。

専門家に質問してみよう