• ベストアンサー

fopen.cの中身について

いつもお世話になっています。 VS2005でWindowsアプリケーション作成を行っています。 ただいまファイル操作を行っているのですが、あるファイルを読み込みモードでfopenしようとする時点でアプリが中断されてしまい、fopen.cファイルが表示され下記のソースにチャックがされます。 if(*file==_T('\0')) { errno=EINVAL; return NULL; } このソースコードはどういう意味のものなのでしょうか。 エラー解決のため、ご教授お願いいたします。

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

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

>その呼び出し履歴から自分のコードまで戻って確認をする >というやり方?を教えていただきたいです。 まず、確認ですが… fopen.cの掲示された行で停止する。んですよね? 停止した状態から、デフォルトで右下のウィンドウに「呼び出し履歴」というタブがあるはずです。 赤丸に黄色い矢印で現在の位置(fopen.cのライブラリ内?)が示されているかと思われます。 下の行をダブルクリックすると、その呼び出し元のソースに移動できます。 # ソースがない場合はディスアセンブリされたコードの位置。 同じように1行下をダブルクリック…と続けていくと、どこかで自分の書いたコードにたどり着けるハズです。 # 自動生成されたファイル…という場合もあり得ますが。 そこで、呼び出した時の引数の内容などが確認できるかと思います。 http://www.google.co.jp/search?hl=ja&num=30&q=%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E5%B1%A5%E6%AD%B4+%E3%83%87%E3%83%90%E3%83%83%E3%82%B0&btnG=%E6%A4%9C%E7%B4%A2&lr=&aq=f&oq= ただし、コールスタックを破壊していた場合は、呼び出し履歴からは辿れませんが…… 推定では、fopen("","r")などの様に第1引数で渡すファイル名が空になっている。 または、MBCSなfopen()にUNICODEな文字列の入ったモノを渡している…等でしょうか……

mymusic54
質問者

お礼

お返事遅くなりごめんなさい。 丁寧なご回答ありがとうございます。 下記にも示してありますが、 Wr5さんとcyacyaさんが教えてくださったやり方で調べたところ、 ファイル名の値は  0x445c3a43<不適切なPtr> となっていました。 よく調べてみると、ファイルは読み込みモードで開けていますが fscanfで読み込めない状態になっているようです。 読み込みたいファイルの中身は  C:\Test\Debug\Data.txt  Data.txt のように、あるフルパス名とファイル名が書き込まれてあります。 Wr5さんがおっしゃっているように、 「UNICODEな文字列の入ったモノを渡している」のでしょうか。 この場合、「書き換え」が必要になってくるのでしょうか。 質問ばかりになってしまいごめんなさい。Webで調べてもしっくりくるものが 無かったので・・・よろしければ教えていただきたいです。

mymusic54
質問者

補足

こんばんは、今回質問させていただいた者です。 ただいまパソコンに向かって格闘していたところ プログラムが成功しましたので、Wr5さんの補足内容に失礼して ご報告させていただきます。Wr5さんごめんなさい。 いろいろ調べたところ、今までのプログラムのfopenでは 文字列さえ読み込めない状態になっていた事に気づきました。 そこで文字列を入れる変数の型を変えたり等いじっていましたら 文字列が読み込めるようになりました。 これでファイルの中身のフルパス名、ファイル名を読み込めることができました。 大変お騒がせいたしました。 皆さんのお蔭で、C++やVS2005の使い方についてより理解することができました。 この場をお借りしてお礼申し上げます。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.2

例えば、 fopen(filename,"r"); として、この文が実行されるときに、filenameの内容が空なのではないでしょうか? >その呼び出し履歴から自分のコードまで戻って確認をする というやり方?を教えていただきたいです。 今、手元にVS2008しかないのですが、メニューのデバッグからウィンドウ→呼び出し履歴で、呼び出し履歴ウィンドウを表示することが可能です。もしかしたら、呼び出し履歴のところはコールスタックになっているかもしれません。

mymusic54
質問者

お礼

何もしていない段階で「デバッグ」メニューを見ると、 呼び出し履歴は無かったのですが、実行して中断された状態で メニューのデバッグ→ウィンドウに呼び出し履歴を発見いたしました。 そこでWr5さんの教えてくださった通りに見ていくと、ファイル名の値が  0x445c3a43<不適切なPtr> となっていました。 やり方を教えていただきありがとうございます。 続きは改めて上記に示しておきます。

全文を見る
すると、全ての回答が全文表示されます。
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

呼び出し履歴から自分のコードまで戻って、引数に渡しているモノの確認をされたらどうでしょうか? ファイル名渡していない…っぽいですが。

mymusic54
質問者

お礼

早いお返事ありがとうございます。 ご教授の通り確認をしたいのですが、 まだVS2005を使ってまもないので、 その呼び出し履歴から自分のコードまで戻って確認をする というやり方?を教えていただきたいです。 面倒で申し訳ありませんが、よろしくお願いいたします。 何度かファイル操作があるプログラムなのですが、 今まで普通にファイルオープンしていたのに あるファイルをオープンしようとするとエラーが出てしまうんです。 そのfopenをコメントアウトするとプログラムは正常に起動します。 他にもfopenは使っているのですが何故ここのfopenだけ… 頑張ってエラー処理していきたいと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語 fopen

    初心者の質問になります。現在ファイルがオープンできるかどうかを確認したいのですが、指定したディレクトリの中のファイルを指定しているのですが、オープンできませんという結果が返ってきます。同じ場所にファイルを置いてファイル名だけでしていするとオープンが出来ます。 何卒よろしくおねがいします。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main(void) { FILE *fp; char *filename = "/file/d20151001.csv"; fp = fopen(filename,"r"); if (fp == NULL) { printf("\aファイルをオープンできません\n"); } else { printf("ファイルがオープンできました\n"); fclose(fp); } return (0); } ディレクトリ(わかりにくくてすいません汗) file------d20151001.csv data.c 環境 VisualStudio

  • fopenのコード

    初歩的なことですがファイルをオープンするfopenの例題で *************************** #include<stdio.h> int main (void) {   FILE  *fp;     fp = fopen ("test1.txt","w");   if (fp==NULL) {     printf ("ファイルをオープンできませんでした。\n");     return 1;   }    else {     printf ("ファイルをオープンしました。\n");   }    fclose (fp);   printf ("ファイルをクローズしました。\n");    return  0; } *********************************というのがあります。 この中のif文の中のreturnの戻り値が1なのはなぜでしょうか? (例題によっては-1というのもありましたが・・。) またどこに戻り値を返すのでしょうか? もしファイルがオープンできなければその時点で終了になるのでしょうか?初歩的なところですがお願いします。

  • fopenでのパス指定

    毎度お世話になります。 ただ今VS2005でWindowsアプリケーションの実装を行っています。 fopenでパス指定をしてファイルを開くとき、  fopen("C:\\Test\\data.txt", w); としますが、GetModuleFileNameで取得したパス↓  GetModuleFileName(NULL, szPath, sizeof(szPath)); を使用したいとき、単に  fopen(szPath, w); ではできません。これはszPathの中身が  C:\Test\data.txt となっているためにfopenでは開けないんだと思うのですが、 わざわざszPathの文字を1文字づつ見ていって、 "\"があったときに"\"を付け足す… という作業をしなければならないのでしょうか。 他に解決策があるのでしょうか。 ご教授お願いします。

  • fopen関数について

    ----------------------------------------- #include<stdio.h> #include<stdlib.h> int main() { FILE *fp; char filename[80],ss[256]; printf("ファイル名="); gets(filename); if((fp=fopen(filename,"r"))==NULL){ printf("ファイルをオープンできません.\n"); exit(1); } while(fgets(ss,256,fp)!=NULL){ printf("%s",ss); } puts(""); fclose(fp); return 0; } ----------------------------------------- 初心者な内容の質問ですいません。 以上のプログラムでまず、「gets(filename);」により、「filename[80]」の配列に「aaa.txt」という文字列を格納し、そのファイルをfopenで読もう込もうとしています。 そこで、 if((fp=fopen(filename,"r"))==NULL) の部分に疑問があるのですが、「filename」という配列名だけで中身の「aaa.txt」と何故認識できるのでしょうか? 配列名ということで、先頭アドレスのみの情報しかないと思いました。 教えていただければ嬉しいです。

  • ファイルをドロップすると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言語で簡単なプログラムを作っているのですが、 「テキストファイルが存在し、かつ空のテキストファイル(開いても何も書かれていない)だと、そのテキストファイルを削除する」 というコードはどうのように書けばいいのでしょうか? 現在自分が考えているのは、 #include<stdio.h> int main(){ FILE *fp; if((fp=fopen("example.txt","r"))==NULL){ printf("file not open\n"); }else if(((fp=fopen("example.txt","r"))!=NULL)&&(fgetc(fp)==NULL)){ //「ファイルがあって、中に何も書かれていない」という条件式を書きたい// remove("example.txt"); } return 0; } 大学で講義としてC言語を習っている程度の知識です。 fopenのif文の書き方があってるかどうかもわからないんですが^^; borland c++ 5.5.1を使用しています。 よろしくお願いします。

  • fopen【C言語】

    C言語でファイルをオープンするときに デスクトップにあるkanjdata.txtというファイルを指定したいのですが \ や : 等色々試してみたのですがどうしてもファイルが開けません、どの様に指定すればデスクトップにあるファイルをオープンできるのでしょうか?? kanjdata.txtのある場所は C:\Documents and Settings\ユーザ\デスクトップ です、よろしくお願いいたします. 今作っているもの if( (fp = fopen("kanjdata.txt","rt") ) ==NULL ) { printf("ファイルが開けません\n") ; exit(0) ; }

  • C言語 fopenのエラー処理

    #define IN "*.txt" FILE *rp; if (!(rp = fopen(IN, "r"))){ printf("Can't open file.\n"); return (-1); } というプログラムを書いていたのを見たのですが、これでどうやってエラー判定してるのか分かりません。 「!」はどういう役割をになっているのですか??

  • C言語、fgetcを利用しファイルの内容を変数に

    C言語について質問です C言語のfgetcを利用しファイルの内容を変数にいれてそれを返す関数を作っているのですがうまくいきません <!--以下ソース--> char *file_get_contents(char *filename){ FILE *fp; int c; char *return_str; if((fp=fopen(filename,"r"))==NULL) return NULL; while((c=fgetc(fp))!=EOF ){ sprintf(return_str,"%c",c); } fclose(fp); return return_str; } 誰か理由と改善方法を教えてください!

  • fopenできる上限の変更

    C言語のfopenで同時に開けるファイル数の上限を変える方法を教えてください。 3000個程度を超えると開けなくなりました。(戻り値がNULL) 自分としては512や2048以上のファイルを開けたことが不思議だったのですが・・・ 以下にOSのバージョンなどを書きます また、fopenで開けるファイル数の上限はどのようにして見ることができますか。(書かれている変数がありますか? あともうひとつ、 100万程度の大量のファイルを同時に開ける言語はありますか。 (OSの限度などは抜きにして。) よろしくお願いします。 ---- OSはDebian 4.0 コンパイラはgcc 4.1.2 /proc/sys/fs/file-max による上限は数十万でした。