(DXライブラリnoFileRead_getcについて

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

(DXライブラリnoFileRead_getcについて

#1

投稿記事 by » 16年前

DXライブラリのFileRead_getc関数を使用し、
テキストファイルの内容を読み出すことを試していた際、改行を検出した時点でそこにヌル文字を代入するという処理を行おうと思ったのですが、うまくいきません。
具他的に言うと、
void draw_block(){
	int fp, size=0, p_posi=0;
	char String[256];


	//ファイルを開く
	fp = FileRead_open( "haiti.txt" ) ;

	for(int i=0; i<100; i++){
			String=FileRead_getc(fp);
			DrawFormatString( 10*i, 100, color_white, "%c", String) ;
			//String[3]='\0';
				if(String=='\n'){
						String='\0';
						break;
				}
	}
	size=FileRead_size( "haiti.txt" ) ;
	p_posi=FileRead_tell( fp ) ;

	// 画面に描画
	DrawFormatString( 0, 0, color_white, "%s", String);
	DrawFormatString( 0, 40, color_white, "size=%d byte", size) ;
	DrawFormatString( 0, 60, color_white, "p_posi=%d byte", p_posi) ;

	// ファイルを閉じる
	FileRead_close( fp ) ;
}
haiti.txtの中身。
10011
2


このようなプログラムを実行してみると、

1001・

という結果になってしまいます。
この「・」の部分にヌル文字が入るようにし、1001と表示したいと思っています。
「・」の部分がヌル文字なのかと思い条件式の内容を変更し、
試してみましたがそういうわけでもないようです。
getcが2バイト文字を正常に読み込めないのが関係しているのかとも思っているのですが……(haiti.txtの中身はすべて半角で書いています)。
ちなみにfgetcで試してみましたが、1001と表示されました(コンパイラはBorlandC++ Compilerです)
もしよろしければアドバイス頂けると幸いです。

開発環境:VisualC++ 2005
OS:Windows XP
ライブラリ:DXライブラリ

Re:無題

#2

投稿記事 by » 16年前

すいません、勢いでエンター押してしまいました……。


タイトル:DXライブラリのFileRead_getcについて

です。
編集キーを設定しないまま投稿してしまったため編集できず、申し訳ないですm(__)m

御津凪

Re:無題

#3

投稿記事 by 御津凪 » 16年前

おそらく、テキストファイルの改行コードが "\r\n" (CR LF) になっているので、
「・」はその "\r" の部分だと思います。
fgetc で無事にできたのは fopen で テキストコードとして開かれているため、
内部で改行を "\r\n" から "\n" に変換されます。

試しに fopen で "r" を "rb" にしてやってみてください。

FileRead_getc と同様の結果になれば、改行コードが原因です。

# となると、FileRead_getc はテキストコードとして開かれていないことになりますね。

対処方法はテキストファイルの改行コードを "\n" (LF)として保存するか、
自前で "\r" をスキップするようにする必要があります。

non

Re:無題

#4

投稿記事 by non » 16年前

御津凪さんの言われる通りだと思いますので、
if(String=='\n')をif(String=='\r')にしてみたらどうですか?

Re:無題

#5

投稿記事 by » 16年前

CR LFが何か分からなかったため、ちょっと調べてみましたが、
改行コードもなかなか奥が深いのですね。。。

なんとなくどういう仕組みになっているのか理解できたため、
まずはnonさんの言われた通りに変更してみた所、問題なく表示されました。
次にテキストファイルの行末コード自体を変更する方法を試した所、こちらも問題なく表示できました。

最終的には、
if(String=='\r'){
	String='\0';
}
else if(String=='\n'){
	String='\0';
	break;
}


という条件式にすることで落ち着きました。

とりあえずWindowsでは改行コードがCRとLFの連続した文字コードだということが分かり、
疑問が解けてすっきりしました。
御津凪さん、nonさん、アドバイスありがとうございます。

閉鎖

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