• ベストアンサー

C言語 [fopenのエラーについて困っています]

工学系大学一年生のものです。 VistaPC上で「Microsoft Visual C++ 2008 Exress Edition」を使っているのですが、 あるプログラムをビルドすると 'fopen'の宣言を確認してください 'fscanf'の宣言を確認してください というエラーが出てしまいます。 ネットで調べたら「fopen」などの記述は古いからこのようなエラーが出るらしいのですが、実際に使用できないのでしょうか。 学校のPCでは使えました。 上記のエラーは出るものの、一応実行ファイルは作成されるのですが、それを実行すると 下記の画像のようなエラーが出て実行されません。 http://www.dejavu.jp/~webmaster/upbbs/users/test/img/1199284636.jpg 必要であればソースも記述します。 なぜこのようなエラーが出るのかご教授お願いします。 冬休み中の課題に響くので、出来るだけ早い回答をお願いいたします。 事情があって明日は返信できないので、先にお詫びさせていただきます。

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

  • ベストアンサー
回答No.5

> しかしそのフォルダに、呼び出すテキストファイルを入れても > 先ほど私が書いたプログラムでは、また画像で示したのと同じ > エラーが起きてしまいました。 "ファイル名が間違っている"くらいしか思い当たりません。 #include <stdio.h> int main() {  int a;  FILE* fp = fopen("test.txt","w");  fprintf(fp,"123\n");  fclose(fp);  fp = fopen("test.txt","r");  fscanf(fp,"%d",&a);  printf("%d\n",a);  fclose(fp);  return 0; } だとするとこれ↑もダメですか?

SG-EPI
質問者

お礼

できました! デバッグの時のカレントディレクトリと、 作成されたexeファイルのカレントディレクトリが違うことに 気づかなくて、先ほど間違えてしまっていたようです。 私の早とちりでした。 ご丁寧に最後まで付き合っていただきありがとうございました。 とてもわかりやすい説明でした。 Wr5さんもご指導ありがとうございました。

その他の回答 (4)

回答No.4

> ソースファイルと同じフォルダにちゃんと入れているのですが… 実行時のディレクトリ(フォルダ)が"そこ"であるかを確認しなければなりませんね。 #include <stdio.h> int main() {  FILE* fp = fopen("test.txt","w");  fprintf(fp,"test\n");  fclose(fp);  return 0; } を実行し、"test.txt"が"そこ"にできていますか? "test.txt"が作られたフォルダに入力ファイルを置いてください。

SG-EPI
質問者

補足

返信遅れてすみません。 提示されたプログラムで書き出してみると、ひとつ違う階層にできていました。 しかしそのフォルダに、呼び出すテキストファイルを入れても 先ほど私が書いたプログラムでは、また画像で示したのと同じエラーが 起きてしまいました。 カレントディレクトリに対象のファイルがあるのに開くことができず、 あのエラーが出るのは何故なんでしょうか… またご回答お願いします。

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

簡単にプロジェクト作って試しました。 下記のソースファイルは、 C:\Documents and Settings\xxxxx\My Documents\Visual Studio 2008\Projects\fopen_test\fopen_test に保存されています。(当方、XPです。) // fopen_test.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { FILE *fp; int a; fp = fopen("test.txt","r"); fscanf(fp, "%d", &a); fclose(fp); return 0; } 「Microsoft Visual C++ 2008 Exress Edition」でビルドし、そのまま実行したら提示されているのと同じエラーになりました。 # test.txtを作成していないので当たり前ですが。 ソースと同じディレクトリに数字を書き込んだtest.txtを置き、 「Microsoft Visual C++ 2008 Exress Edition」からF5キーで起動さした場合はエラーなしでした。 C:\Documents and Settings\xxxxx\My Documents\Visual Studio 2008\Projects\fopen_test\Debug に作成されたexeをダブルクリックで実行の場合はエラーになることは確定しているので試すまでもなく…。

SG-EPI
質問者

お礼

ご回答ありがとうございます。 プロジェクト作成でできたフォルダにソースファイルも呼び出すファイルも入れています。 作っていただいたプログラムをコピペしてビルドしてみたらエラーがいくつか出たので、少し変えてビルドしました。 test.txtには数字を並べ、ソースファイルと同じフォルダに入れました。 #include<stdio.h> int main(){ FILE *fp; int a; fp = fopen("test.txt","r"); fscanf(fp, "%d", &a); printf("%d",&a); fclose(fp); return 0; } F5で起動してみると、コンパイルは出来るのですが、デバッグのところでやはり同じエラーがでてしまいます 何かまだ参照できていない要因があるのでしょうか。

回答No.2

>「fopen」などの記述は古いからこのようなエラーが出るらしい > のですが、実際に使用できないのでしょうか。 errorじゃなく、warningですよね? 使えないわけじゃありません。気になるならコードの先頭に #define _CRT_SECURE_NO_WARNINGS を入れておくとwarningが消えます。 > 一応実行ファイルは作成されるのですが、それを実行すると > 下記の画像のようなエラーが出て実行されません。 fopenに失敗しています。openしようとするファイルが存在しない などの理由が考えられます。

SG-EPI
質問者

お礼

ご回答ありがとうございます。 warningでした。 無視できるなら無視します。 プログラミングを始めたばかりなので、あまり難しいことを書くと頭がこんがらかってしまいそうです。 ソースファイルと同じフォルダにちゃんと入れているのですが… ただ入れるだけではいけないのでしょうか。

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

>VistaPC上で「Microsoft Visual C++ 2008 Exress Edition」を使っているのですが、 >あるプログラムをビルドすると >'fopen'の宣言を確認してください >'fscanf'の宣言を確認してください fopen_sやfscanf_sを使用した方がよい。 という警告でしょう。 fopenで正しくオープン出来ていますか? 戻り値は確認していますか? fopen("test.txt", "r")等のようにオープンした場合、 「カレントディレクトリ」に対象ファイルがない場合はオープンに失敗します。

関連するQ&A

  • fopenでエラーとなる

    fopenを使用してログファイルへ書き込み時に、errno=13 Permission denied のエラーがまれに発生するときがあります。 ログファイルは、1ログを書く毎に、その都度、オープン/クローズしています。fopenの第二引数は"a+t"を指定しています。(テキストモード追加書き込み。+を指定している理由は、更新は行いませんが、Ctrl-Zの削除の為、+を指定することがマイクロソフトにより推奨されているため) もちろん、このログファイル(ディレクトリ含む)への書き込み権限がないということは、ありません。(あれば必ず発生しますので) 従って一時的に、書き込み不能となる状態が発生していると考えられます。エラーが発生した後も、一定の時間が経過した後には書き込めるようになります。 このような事象に遭遇したことのあるかたが、おりましたら、その旨回答下さい。又、解決方法(このような事態をさける方法)をご存じのかたがおりましたら、教えて下さい。 実行環境 Windows2003-server 開発環境 Visual Studio .NET 2003のC++による開発(コードの内容は実質的にC言語を使用、MFCは使用していません)

  • C言語のプログラムなのですが、エラーの原因がわからずに困っています。

    C言語のプログラムなのですが、エラーの原因がわからずに困っています。 ./moji/learn/data/0-00.dat ./moji/learn/data/0-01.dat のようにファイル名が並んでいるテキストファイルをオープンし、 fscanfでファイル名をfileName[256]という配列に代入し、 そのファイル名のテキストファイルをオープンしてデータを読んでいくというものです。 void fv(char *files, int i) { FILE *data; data = fopen(files,"r");     if(data == NULL) { printf("Error\n"); exit(1); } int j, k, l, m, w, h, ww, hh, t; int dw[DN], dh[DN]; fscanf(data, "%d", &w); fscanf(data, "%d", &h); ww = w % DN; hh = h % DN; for(j = 0;j < DN;j++) { dw[j] = w / DN; dh[j] = h / DN; if(ww > 0) { dw[j] += 1; ww--; } if(hh > 0) { dh[j] += 1; hh--; } } for(l = 0;l < DN;l++) { for(m = 0;m < dh[l];m++) { for(j = 0;j < DN;j++) { for(k = 0;k < dw[j];k++) { fscanf(data, "%d", &t); t = 1; feature[i][l][j] += t; } } } } for(l = 0;l < DN;l++) { for(j = 0;j < DN;j++) { feature[i][l][j] = feature[i][l][j] * 10000 / (w * h); } } } 読み込んだファイル名をfvに渡して、 fvを繰り返し実行して計算を行うのですが、 最初の1000回は問題なく実行できるのですが、 1020回実行したところで、 Error が表示されてしまいます。 ファイルは存在しているため、なぜfopenで失敗するのかがわかりません。 原因として考えられることは何があるのでしょうか?

  • Visual C++に関して

    Visual C++でプログラムを実行すると 「実行するビルド コマンド ラインがありません。」 というエラーメッセージがでます。一体なんでしょう??

  • fopenが動作しない

    PHPで、別のファイルで取得したファイル名をもとに fopenを使ってファイルを開こうとしているのですが、 どうしてもうまくいきません。 具体的な症状は以下のとおりです。 a.phpの中で、 … $file[2] = "hoge02.xml"; … のように、配列にファイル名を代入します。 これを b.php で require_once('a.php'); とした後 print_r($file); とすると Array([0] => … [2] => "hoge02.xml" [3]…) のように表示されるところまでは確認できました。 しかし、 $file0 = $file[2]; $fp = fopen("$file0", 'r'); とすると Warning: fopen( "hoge02.xml" ) [function.fopen]: failed to open stream: Invalid argument in [b.php の絶対アドレス] とエラーが出てしまい、実行することが出来ません。 そこで、 //$file0 = $file[2]; $file0 = "hoge02.xml"; $fp = fopen("$file0",'r'); とすると実行することが出来ました。 作成しているシステム上、fopenの1つ目の引数には変数または配列を使いたいのですが、 エラーが発生してどうしてもうまくいきません。 自分なりにも似たようなエラーがないか調べたのですが、 それらしいものを見つけることが出来ず、お手上げ状態です。 どなたか解決策をご存じないでしょうか。 ご教授の程、よろしくお願い致します。

    • 締切済み
    • PHP
  • microsoft visual C++ でC言語のプログラミング

    プログラミングの超初心者です。 microsoft visual C++ 6.0を利用してC言語のプログラミングをしたいのですが,最も基本のhello worldを表示させようとしてビルドを行うと以下のようなエラーが表示されますが,解決法がわかりません. --------------------構成: hello1 - Win32 Debug-------------------- リンク中... LINK : fatal error LNK1104: ファイル "Debug/hello1.exe" を開けません。 link.exe の実行エラー hello1.exe - エラー 1、警告 0 解決法を教えていただけるとうれしいです. お願い致します.

  • Visual C++にて「再定義されています」と…

    VisualC++2010にて、OpenCVを導入しようといろいろ弄っていたら以下のような文章が出るようになりました。 1>------ ビルド開始: プロジェクト: imiwakaran, 構成: Debug Win32 ------ 1> stdafx.cpp 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(27): error C2371: 'size_t' : 再定義されています。異なる基本型です。 1> c:\users\ooka\documents\visual studio 2010\projects\imiwakaran\imiwakaran\predefined c++ types (compiler internal)(19) : 'size_t' の宣言を確認してください。 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== 再定義されているとのことなので書き換えようとしましたが、書き換えが不可能なファイルでした。 これのせいでHellow Worldすら実行できなくなりました。 Visual系のソフトをすべてアンインストールして、再インストールしましたが現状のままでした。 どなたか詳しい方、どうかお助けください。

  • VBAとC言語でwavファイル再生

    VBAとCのプログラムについてどなたかアドバイスしていただけませんか? 特定のcsvファイルに1が入ったら指定のwavファイルを再生させるプログラムを作りたいのですが、 どうしてもエラーになってしまいます。 (必ずどこかのcsvに1が入り、その他のcsvには0が入るようにしています。) 以下にVBAとCのプログラムを載せます。 ちなみに、VBAはopen1と同様の内容をopen10まで行い、read1も同様にread10まで行います。 Sub open1() Dim buf As String Open "C:\Users\Documents\Debug\file1.csv" For Input As #1 Do Until EOF(1) Line Input #1, buf Cells(1, 1) = buf Open "C:\Users\Documents\Visual Studio 2008\Projects\PlaySound\Debug\1.csv" For Output As #2 Print #2, buf Close #2 Loop Close #1 End Sub Sub read1() Dim FlNum As Long, FlName As String, Atai As Variant FlNum = FreeFile FlName = "C:\Users\\Documents\Debug\file1.csv" Open FlName For Output Access Write As #FlNum Atai = Range("A1") Print #FlNum, CStr(Atai) Close #FlNum End Sub これでcsvの内容をコピーさせています。 そして、Cのプログラムが以下です。 #include "stdafx.h" #include <windows.h> #include <mmsystem.h> #include<stdio.h> #include<time.h> #include<windows.h> #pragma comment (lib,"winmm.lib") FILE *fp1; FILE *fp2; FILE *fp3; FILE *fp4; FILE *fp5; FILE *fp6; FILE *fp7; FILE *fp8; FILE *fp9; FILE *fp10; int _tmain(int argc, _TCHAR* argv[]) { //引数 int s; int t; int u; int v; int w; int x; int y; int z; int z1; int z2; //回数表現 int a=1; int b=1; int c=1; int d=1; int e=1; int f=1; int g=1; int h=1; int h1 = 1; int h2 = 1; while(1){ Sleep(2000); fp1 = fopen("1.csv","r"); fp2 = fopen("2.csv","r"); fp3 = fopen("3.csv","r"); fp4 = fopen("4.csv","r"); fp5 = fopen("5.csv","r"); fp6 = fopen("6.csv","r"); fp7 = fopen("7.csv","r"); fp8 = fopen("8.csv","r"); fp9 = fopen("9.csv","r"); fp10= fopen("10.csv","r"); printf("finish to open csv file\n"); fscanf(fp1,"%d",&s); printf("finish to scan file1.csv %d\n", &s); fscanf(fp2,"%d",&t); fscanf(fp3,"%d",&u); fscanf(fp4,"%d",&v); fscanf(fp5,"%d",&w); fscanf(fp6,"%d",&x); fscanf(fp7,"%d",&y); fscanf(fp8,"%d",&z); fscanf(fp9,"%d",&z1); fscanf(fp10,"%d",&z2); printf("finish to scan csv file\n"); if(s==1&&a==1){ ::PlaySound(_T("what.wav"),NULL, SND_FILENAME); b = 1; c = 1; d = 1; e = 1; f = 1; g = 1; h = 1; h1 = 1; h2 = 1; a++; } (同様にif文がcsvのそれぞれにつきあるのと、fcloseもありますが、省略します。) ビルドは正常終了するのですが、デバッグすると以下のエラーメッセージが出ます。 Debug Assertion Failed! Proogram:...\Debug\PlaySound.exe File:f:\dd\vctools\crt_bld\self_x86\crt\src\fscanf.c Line:52 Expression:(stream != NULL) For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts. (Press Retry to debug the application) 中止(A)再試行(R)無視(I) 試しにDebugフォルダにできた実行ファイルを開くと printfできちんと出力もできてますし、 csvファイルもきちんと出力できています。 wavファイルを再生させるにはどうしたらいいでしょうか。

  • C++でOpenCV コンパイルでエラー

    超初心者です。 Visual C++2010 ExpressでOpenCVを使おうとしています。 このページを参考にしています。 http://gihyo.jp/dev/feature/01/opencv/0002?page=2 プログラムは以下の通り。 #include <C:\Program Files (x86)\opencv\build\include\opencv\cv.h> #include <C:\Program Files (x86)\opencv\build\include\opencv\highgui.h> int main(int argc, char* argv[]) { IplImage* img; // 画像ファイルポインタの宣言 char imgfile[] = "lena.jpg"; // 読み込み画像ファイル名 // 画像の読み込み img = cvLoadImage(imgfile, CV_LOAD_IMAGE_COLOR); // 画像の表示 cvNamedWindow ("lena", CV_WINDOW_AUTOSIZE); cvShowImage ("lena", img); cvWaitKey (0); cvDestroyWindow("lena"); // 画像の解放 cvReleaseImage(&img); return 0; } コンパイルすると、以下のエラーメッセージが出ます。 1>------ ビルド開始: プロジェクト: try, 構成: Debug Win32 ------ 1> try.cpp 1>c:\program files (x86)\opencv\build\include\opencv\cv.h(63): fatal error C1083: include ファイルを開けません。'opencv2/core/core_c.h': No such file or directory ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== どのようにすれば通るのでしょうか? 教えてください。よろしくお願いします。

  • MS VC++コンパイルエラーなし...ビルドエラー

    Microsoft Visual C++ で、新規作成 - 「プロジェクト」 - Win32 Application で作成し、「ファイル」-  C++ソースファイルで、main.cpp と言う名前で、以下のソースを作成しました。 #include <stdio.h> #include <stdlib.h> void main(int argc) { FILE *Fout; Fout = fopen("Date.ini" , "W "); fprintf(Fout , "%d" ,argc); fclose( Fout); } 別に作成したdllが、fscanfするためのテキストファイルを日次ハバッチで、作成したいと思っています。 尚、ここでfprintfするデータは、パラメータとして、読み込みたいと思っています。 (Visual BASICの command関数のように) 上記のソース、コンパイルは、通るのですが、ビルドすると以下のエラーが出ます。 「LIBCD.lib(wincrt0.obj) : error LNK2001: 外部シンボル "_WinMain@16"は未解決です Debug/Date_ini.exe : fatalerror LNK1120: 外部参照 1 が未解決です。 link.exe の実行エラー 解決法をご教示いただきたく思います。 宜しくお願い致します。

  • Visual C++でC言語の基礎学習

    Visual C++を使ったC言語についての質問です。 (アプリケーションの作成ではなく、コマンドプロンプト上で起動する基礎的な文法の学習です) Win32コンソール プロジェクトを作成し、そのプロジェクトの中でCのソースファイルを作成して実行確認をしようと思っています。 プロジェクト内のソースファイルが1つだけだと正常にビルドできますが、2つ以上のソースファイルを作成してビルドすると 「1 つ以上の複数回定義されているシンボルが見つかりました。」 というエラーがでてしまい、実行することができません。 新たにWin32コンソール プロジェクトを作成し、その中でソースファイルを作成しなければ実行できないのでしょうか? よろしくお願いします。

専門家に質問してみよう