• ベストアンサー

C ファイル出力で、フォルダがない場合でも作成する方法

redfox63の回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

ファイルのオープンはどのようなコードにしてますか? 一度にフォルダを作成して出力ファイルを作成するなどという便利な命令はありません WinAPIなら hFile = CreateFile( ... ); if (hFile == NULL ) {  DWORD dwError = GetLastError();  if ( dwError == ERROR_PATH_NOT_FOUND ) {   // フォルダーを作成   CreateDirectory(...);   // ファイルの再オープン   hFile = CreateFile( ... );  } else {   // 他のエラーの対処  } } といった具合でしょう # CreateFile/CreateDirectoryの引数などは ヘルプで確認してください

関連するQ&A

  • WinAPIでフォルダ作成

    先日質問させていただき、 ファイル出力時に、フォルダを作成し、そのフォルダにファイルを出力していく方法をお聞きしたところ、 _mkdir()関数を使い、最初にフォルダを作っておく方法を教わり、 これは上手くいきました。 それとは別に、WinAPIを使い、フォルダの有無を調べ、無い場合は 作成するという方法があるのを教えてもらいました。 WinAPI使ったことないので、良くわからなかったのですが、 丁寧な説明を頂き、ほとんど、コピーして貼り付けるだけだったので 実行してみたのですが、意味のわからないエラーが出てしまいました。 実行した方法は、 #include <shlwapi.h> #include <windows.h> if ( PathIsDirectory(path) ){ ←フォルダ有無  CreateDirectory( path, NULL ); ←フォルダ作成 } sprintf( buff, "%s\\%s", path, filename ); fp = fopen( buff, "w" );  : fclose( fp ); エラーの内容は 構文エラー : 識別子 'DECLSPEC_IMPORT' がシンタックスエラーを起こしました。 というものでした。 エラーの部分は、よく解らないのですが、自分で書いたメインの文ではなく、何かのヘッダ部分?のようでした。 もしかして、WinAPIを使うには、何かインストールしないとマズイのでしょうか?? これだけの説明で、何が悪いのか指摘できるのかわかりませんが、 わかる方いらっしゃいましたら教えて下さい。 何か足りない情報があったら書き込みます! ちなみにもう一つお聞きしたいのは、フォルダのpath指定のところは 相対パスでもいいのでしょうか? 例えば、現在Cファイルがある場所にDATAというフォルダを作りたかったら、 path指定のところは、 PathIsDirectory(DATA) で問題ないのでしょうか? すみませんが、回答お願いします!

  • cvSaveImageで画像を保存する際のフォルダ指定

    現在C++,OpenCVを用いてプログラム内で生成した画像をフォルダを指定して1フォルダ内に100枚程度の画像をどんどん保存していくというプログラムを作成しています。 そこで、フォルダを指定してcvSaveImageで画像を保存しようとすると、エラーが出てしまい保存する前にプログラムがダウンしてしまいます。 具体的には以下のとおりです。 変数 char filename[]; //出力画像の名前 char path[] = "testdir";//相対パス名(フォルダ指定用) IplImage* testimage; //生成した画像 成功例(フォルダ指定なし) sprintf(file,"%s\\test.bmp",path,); cvSaveImage(file, testimage); 失敗例(フォルダ指定あり) sprintf(file,"%s\\test.bmp",path,); cvSaveImage(file, testimage); 環境は Win XP Pro 2002 sp3 Visual C++ 2008 Express Edition OpenCV1.1 です。 どなたかご教授お願いいたします。

  • ファイルの出力先がうまく指定できません。。

    今、ファイルの出力先を変更させたいと思っていて、 調べたところ、fp=fopen("フォルダ名/test.txt","wb") のようにすればよい、というところまでは調べたのですが、 私の場合、ファイル名を、filenameというchar型の変数に入れており、 fp=fopen(filename,"wb")となってます。 これを、fp=fopen("フォルダ名/filename","wb")としてみたのですが、 これではダメでした。 ファイル名の入っている変数はそのまま使いたいのですが、 それでパス指定をする方法ありますでしょうか?

  • ファイルをドロップするとfopenからファイルが作成できません

    C言語でコンソールアプリケーションを作っています。 ファイルをexeにドロップして実行し、別のファイルに結果を出力させたいのですが、出力ファイルが作成されません。 どのようにすればよろしいのでしょうか。 コンソールから渡すときはファイルが作成されます。 コンパイラはBorland C++ Compiler 5.5を使用しています。 以下にコードの一部を掲載します。 int main(int argc, char *argv[]) {  char filename[256];  FILE *inputFile;  FILE *outputFile;  int i;  for(i=1; i<argc; i++)  {   if((inputFile=fopen(filename,"r")) == NULL)   {/*エラー処理*/}   sprintf(filename,"result%d.txt",i); // 出力ファイル名   if((outputFile=fopen(filename,"w")) == NULL)   {/*エラー処理*/}   for(;;)   {    char ss[1024];    if(fgets(ss,1024,inputFile) ==NULL) break;    fputs(ss,outputFile);   }   fclose(inputFile);   fclose(outputFile);  }  return 0; }

  • C言語でのフォルダ作成

    C言語でファイルをあるフォルダに出力する際に、フォルダがない場合、自動的にフォルダを作成するようにプログラムを組むことってできますか?

  • フォルダ参照ではなくファイルを指定したい。

    フォルダの参照ダイアログボックスを使用して ファイルを選択できるようにしています。 プログラムでcsv形式で保存し、そのcsv形式ファイルを指定して開くという動作を目的としています。 そのファイル選択を固定でなく可変で選択したいと思っています。 Dim ShellApp As Object Dim oFolder As Object Set ShellApp = CreateObject("Shell.Application") Set oFolder = ShellApp.BrowseForFolder(0, "ファイル選択", &H4000,"C:\test") msgbox(oFolder) このような感じで、フォルダのみではなくファイルを指定することに成功しました。 しかし、このフォルダ参照ダイアログが表示されたときに、何も選択せずに キャンセルボタンをクリックするとエラーが出て止まってしまいます。 目的とする動作はできてはいるのですが、キャンセルするとエラーになるので、この原因がわからず困っています。 キャンセルボタンに関することを記述する必要があるのでしょうか? また、この他にファイルを指定するのに適した方法がありましたら教えてください。 参照するフォルダを指定しているのでパスの取得は必要ありません。 ファイルが選択できたらOKです。 フォルダのパス取得のプログラムはよくサンプルを見かけるのですが、 ファイル選択のサンプルはあまり見かけないです(-_-;) また、この方法ではC:\と絶対パスで指定していますが、exeファイルが存在する場所からの相対パスでの指定はできないのでしょうか? csvで保存する時は"./test/test.csv"などと記述して書き込みできていたのですが、 このようなパスを書くとエラーとなりファイルを見つけられないといわれてしまいます。

  • フォルダ一覧の出力

    フォルダの一覧をExcel形式、もしくはテキスト形式で出力したいと考えてます。 ファイル数が膨大なので、ファイル別の情報ではなく、フォルダ別に フォルダ名(フルパス、もしくは階層表示)とサイズを一覧で出力するフリーソフトを探してます。 贅沢言えば出力対象とするフォルダの階層まで指定できると助かります。 ファイル数が多く、ファイル一覧を出力してからサマリーすると非常に時間がかかるので、もし上記のようなフリーソフトをご存知の方がいましたら是非ご紹介願います。 よろしくお願い致します。

  • C言語でのCSVへの出力がうまくいきません…

    風力発電の発電データを1秒ごとに1日分を記録したCSVファイルを読み込み、集計して、集計用の新しいCSVファイルに書き込むプログラムを組もうとしています。以下にソースコードを記載します。 #include<stdio.h> #include<stdlib.h> static char filename[100]; static char wfname[100]; char fname2[256]; void str_copy(char[],char[]); //文字列のコピー void str_cat(char[],char[]); //文字列の連結 struct kaze { _char jikoku[16]; _double fuusoku; _double fuuko; _double denatu; _double denryoku1; _double denryoku2; _double co2; }; struct kaze data[86400]; int main() { _char date2[50]; _char date3[50]; _char month2[10]; _char year2[10]; _char path1[50]="F:\\風力発電\\風車"; _char path2[10]="年"; _char path3[10]="月\\WP"; _char buff[256]; _int month1,month,year,date; _int kensuu,i,j,uruu; _FILE *fpin,*fpout; _printf("集計する年を入力してください。\n"); _scanf("%d",&year); _printf("集計する月を入力してください。\n"); _scanf("%d",&month); _if(month==2){ __printf("閏年ですか?(はい -> 1 いいえ -> 2)"); __scanf("%d",&uruu); _} _if(month==2){ __if(uruu==1){ ___month1=29; __} __else{ ___month1=28; __} _} _else if(month==4 || month==6 || month==9 || month==11){ __month1=30; _} _else{ __month1=31; _} _date=year*100+month; _sprintf(date3,"%d",date); _str_copy(wfname,date3); _str_cat(wfname,".csv"); _sprintf(year2,"%d",year); _sprintf(month2,"%d",month); _sprintf(fname2,"%s%s%s%s%s%s",path1,year2,path2,month2,path3,wfname); _if((fpout=fopen(fname2,"w"))==NULL){ __printf("ファイルが作成できません。 --- %s\n",fname2); __exit(EXIT_FAILURE); _} _fprintf(fpout,"日付,平均風速,平均風向,平均電圧,平均発電電力、発電電力量,CO2削減量\n"); _fprintf(fpout,"年/月/日,m/s,°,V,KW,KWh,kg-c\n"); _printf("集計用ファイルを作成しました。 --- %s\n",fname2); _fclose(fpout); _date=year*10000+month*100; _for(j=1;j<=month1;j++){ __double fuusoku=0,fuuko=0,denatu=0,denryoku1=0,denryoku2=0,co2=0; __date++; __sprintf(date2,"%d",date); __str_copy(filename,date2); __str_cat(filename,".csv"); __sprintf(buff,"%s%s%s%s%s%s",path1,year2,path2,month2,path3,filename); __if((fpin=fopen(buff,"r"))==NULL){ ___printf("ファイルが見つかりません。--- %s\n",buff); ___exit(EXIT_FAILURE); __} __for(kensuu = 0; fscanf(fpin, "%[^,],%lf,%lf,%lf,%lf,%lf,%lf\n", data[kensuu].jikoku, &data[kensuu].fuusoku, &data[kensuu].fuuko, &data[kensuu].denatu, &data[kensuu].denryoku1, &data[kensuu].denryoku2, &data[kensuu].co2) != EOF; kensuu++); __for(i = 0; i < kensuu; i++){ ___fuusoku+=data[i].fuusoku; ___fuuko+=data[i].fuuko; ___denatu+=data[i].denatu; ___denryoku1+=data[i].denryoku1; } __fuusoku/=86400; __fuuko/=86400; __denatu/=86400; __denryoku1/=86400; __denryoku2=data[kensuu-1].denryoku2; __co2=data[kensuu-1].co2; __fclose(fpin); __printf("\n%d年%d月%d日の集計結果\n平均風速:%lf(m/s)\n平均風向:%lf(°)\n __________平均電圧:%lf(V)\n",year,month,j,fuusoku,fuuko,denatu); __printf("平均発電電力:%lf(kW)\n発電電力量:%lf(kWh)\nCO2削減量:%lf(kg-c)\n" ,denryoku1,denryoku2,co2); //ここまでは正常に動作する。 ●if((fpout=fopen(fname2,"a"))==NULL){ ___printf("ファイルに追記できません。--- %s\n",fname2); ___exit(EXIT_FAILURE); __} __fprintf(fpout,"%d/%d/%d,%s,%s,%s,%s,%s,%s\n",year,month,j,fuusoku,fuuko,denatu,denryoku1 ,denryoku2,co2); __printf("以上の結果を記録しました。 --- %s",fname2); __fclose(fpout); } _return EXIT_SUCCESS; } void str_copy(char dst[],char src[]) { _int i; _for(i=0;src[i]!='\0';i++){ __dst[i]=src[i]; _} _dst[i]='\0'; } void str_cat(char dst[],char src[]) { _int i,j; _for(i=0;dst[i]!='\0';i++) ; _for(j=0;src[j]!='\0';j++,i++){ _dst[i]=src[j]; _} _dst[i]='\0'; } 集計用ファイルの作成と項目の書き込み、データファイルの読み込み、集計、ディスプレイへの表示までは問題なく動作するのですが、●印のところで変数fname2がおかしなことになっており、    ファイルに追記できません。--- 23:59:48 と表示されます。どこかでfname2が書き換えられているのだとは思いますが、実際にどこでどうなっているのか、全くわかりません。 どなたか原因がわかる方、もしくは「ここじゃないかな?」など心当たり程度でも構いません。 ご意見をお寄せください!お願いします!

  • フォルダの削除方法

    フォルダの削除エラーが出てフォルダの削除が出来ません。削除右方法を教えてください。エラー表示は下記のように出ます。 『CAKPEPXU.を削除できません。指定されたファイルが見つかりません。パスとファイル名を確認してください。』 宜しくお願いします。<(_ _)>

  • Excel VBA ファイル一覧とファイル作成日(更新日)を出力

    Excel VBA ファイル一覧とファイル作成日(更新日)を出力 はじめまして 指定したフォルダのファイル名一覧の出力方法は、msn相談箱を参考にさせていただき、 再帰法を使ったやりかたで出力することができましたが、 同時にファイルの作成日を出力する方法を教えていただけないでしょうか。 よろしくお願いします。