空行の判定

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ドナルド

空行の判定

#1

投稿記事 by ドナルド » 7年前

#include <stdio.h>
#define N 20
#define M 5
typedef struct plane_map {
double longitude; /* [deg] */
double latitude; /* [deg] */
} PLANE_MAP_TYPE;
int main(void){
FILE *fp_p;
const char plane_map[] = "test.txt";
int i;
PLANE_MAP_TYPE a;

fp_p = fopen( plane_map , "r");
char date1[N];
char date2[N];
for(i=0;i<M;i++){
fgets(date1,N,fp_p);
if(date1[0]!='\n'){
sscanf(date1, "%lf%lf", &a.longitude, &a.latitude);
printf("%.2f %.2f\n", a.longitude, a.latitude);
}
if(date1[0]=='\n'){
printf("\n");
}


}


return 0;
}
/*
3行目を空白にしたいのに
なぜか3行目が2行目をコピーしてしまいます

実行結果を以下に記す
12.00 12.00
11.00 11.00
11.00 11.00
20.00 20.00
30.00 30.00

ファイル(test.txt)は以下に記す
12 12
11 11

20 20
30 30
*/

かずま

Re: 空行の判定

#2

投稿記事 by かずま » 7年前

フォーラムルールに従って、
・codeタグを使用する。
・環境(OS やコンパイラなど)を書く。
そして、送信ボタンを押す前に、プレビューボタンを押して、
質問してください。

質問の現象は、Windows で VC++ を使っても、
Linux で gcc を使っても再現しませんが、
Windows 上で cygwin の gcc を使うと再現しました。

コード:

		fgets(date1,N,fp_p);
の後に
		for (int j = 0; date1[j]; j++) printf(" %02x", date1[j]);
		putchar('\n');
を入れると、原因が分かるでしょう。
空行といっても、先頭にスペースが入っているかもしれません。
私なら for文を次のようにします。

コード:

	for(i = 0; i < M; i++) {
        fgets(date1,N,fp_p);
		if (sscanf(date1, "%lf%lf", &a.longitude, &a.latitude) == 2)
			printf("%.2f  %.2f\n", a.longitude, a.latitude);
		else
			putchar('\n');
	}
date1 という名前は data1 のほうが適切なのでは?

ドナルド

Re: 空行の判定

#3

投稿記事 by ドナルド » 7年前

丁寧にありがとうございます
読み込みのrをrtにしたらWindows上でもできました!

返信

“C言語何でも質問掲示板” へ戻る