アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になっております。
下記のプログラムを実行したところ、

Line: 55
Expression : (str !=NULL)

とエラーが表示されました。
ファイル名もデレィクトリにあります。
使っているソフトは、Visual studio 2010です。

すいませんが、教えてください。本当に些細なことでも大丈夫です。
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PMAX 200
#define MAG 1
struct point {
double x;
double y;
};

int main(void){
FILE *fp, *out;
struct point p[PMAX];
int index, i, point_num, start;
double distance;

if( (fp = fopen( "zahyou1.csv", "r")) == NULL ) {
printf( "can not open the file.\n" );
}

if( (out = fopen( "out.csv", "w")) == NULL ) {
printf( "can not open the file.\n" );
}

i = 1;
while( fscanf(fp,"%d,%lf,%lf", &index, &p[i].x, &p[i].y) != EOF){
i++;
}
point_num = i;

// which point to start
//printf("from which point? : ");
//scanf("%d",&start);

for(start=1;start<point_num;start++) {
printf("start point : %d\n", start);
fprintf(out,"start,%d\n", start);
for(i=1;i<point_num;i++) {
distance = sqrt(pow(p[start].x - p[i].x, 2) + pow(p[start].y - p[i].y, 2));
distance *= MAG;
printf("%3d %f\n", i, distance);
fprintf(out,"%d,%f\n", i, distance);
}
printf("------------------------------------------\n");
}

return 0;

}

A 回答 (1件)

Expression : (str !=NULL)


で検索すると
http://oshiete.goo.ne.jp/qa/459729.html
等が見つかります。

そう考えてプログラムを見ると

if( (fp = fopen( "zahyou1.csv", "r")) == NULL ) {
printf( "can not open the file.\n" );
}

if( (out = fopen( "out.csv", "w")) == NULL ) {
printf( "can not open the file.\n" );
}

いずれも、fopenの戻り値がNULLかどうかのチェックはしていますが、NULLであるとき(=fopenに失敗したとき)にはメッセージを出力するだけで、そのまま実行を続けています。
このままでは、実際にfpやoutを使おうとしたときに、問題となります。

エラーの場合は、後の処理をしないような工夫をしましょう。(exitやreturnで終了させるなど)



また、Visual Studioを使った場合の、よくある話なのですが。
fopen( "zahyou1.csv", "r")
このようにファイル名だけ指定すると、カレントディレクトリにあるディレクトリから探します。
このあたりの詳細は、「作業ディレクトリ」「カレントディレクトリ」等で検索してください。

VisualStudioからデバッグ実行した場合は、プロパティの中にある「デバッグ時の実行ディレクトリ」になっています。
初期では、 bin\Debug やbin\Relase 等の、実行ファイルのあるディレクトリになっています。

ソースコード(~.c)と同じディレクトリに zahyou1.csv があっても、bin\Debug に無ければ fopenは成功しません。
・ファイルの置き場所を変える
・作業ディレクトリをzahyou1.csvのあるディレクトリに指定する
・ファイル名だけではなく、ディレクトリの場所もフルパスまたは相対パスで指定する
といった対策が必要です。
    • good
    • 1
この回答へのお礼

ご丁寧な回答ありがとうございます。

お礼日時:2015/01/22 04:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!