Unicodeテキストファイルをfreadで読み込めない

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

Unicodeテキストファイルをfreadで読み込めない

#1

投稿記事 by みや » 9年前

よろしくおねがいします。

コード:

#include <stdio.h>
#include <string>
#include <DxLib.h>
using namespace std;

int getLine(FILE *f, wstring *line);

int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)
{
	setlocale(LC_ALL, "");
	FILE *f;
	fopen_s(&f, "SCENE_DATA_FILE.txt", "r");
	wstring wline;

	getLine(f, &wline);

	return 0;
}

int getLine(FILE *f, wstring *line)
{
	wchar_t chUnicode;
	int n;

	line->clear();

	for (;;)
	{
		n = fread(&chUnicode, sizeof chUnicode, 1, f);

		if (n == 0) return -1;	//★最後まで読み込んだ場合-1を返す
		if (chUnicode == '\r')
		{
			//\n読み飛ばす
			fread(&chUnicode, sizeof chUnicode, 1, f);
			return line->length();
		}
		else
		{
			line->push_back(chUnicode);
		}
	}
}
上記のようなコードで

「そんなことないさ。普通だよ。」と書いてあるUnicodeのテキストファイル(SCENE_DATA_FILE.txt)を読み込んでみると
最後まで読み込めません。実際には「そんなことないさ。普」までしか読み込めていません。
いくら考えてみてもわからないので質問しました。
どうしたらよいでしょうか、助言下さい。

みや

Re: Unicodeテキストファイルをfreadで読み込めない

#2

投稿記事 by みや » 9年前

補足ですが、開発環境はVisual Studio Express 2013 for Windows Desktopです。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: Unicodeテキストファイルをfreadで読み込めない

#3

投稿記事 by みけCAT » 9年前

「Unicode」といっても、UTF-8、UTF-16、UTF-32などいろいろな種類があります。
テキストファイルのエンコードと、wchar_tのサイズはあっていますか?
'\r'ではなL'\r' (プレフィックスLを追加)と比較するべきではないですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

みや

Re: Unicodeテキストファイルをfreadで読み込めない

#4

投稿記事 by みや » 9年前

テキストファイルの方はUnicodeで書いてることは確認出来てますが、
UTF-8ではありません(サクラエディタで確認済み)、UTF-16なのかUTF-32
なのかは判別方法がわかりません。サクラエディタではUnicodeとしか書いてないので。

テキストファイルのエンコードを調べるにはどうしたら良いのでしょうか?
エンコードとはUnicodeとかUTF-8のことではないのでしょうか?
お手間取らせて申し訳ありませんが、エンコード(UTF-16かUTF-32か)の
調べ方をご教授願えないでしょうか?

追記
L'\r'としても駄目でした。

みや

Re: Unicodeテキストファイルをfreadで読み込めない

#5

投稿記事 by みや » 9年前

wchar_tは2バイト固定では無いのでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: Unicodeテキストファイルをfreadで読み込めない

#6

投稿記事 by みけCAT » 9年前

サクラエディタの「Unicode」はおそらくUTF-16でしょう。
UTF-16またはUTF-32で保存されるとわかっているのであれば、
1文字だけ(改行もなし)書いてBOMなしで保存し、2バイトになればUTF-16、4バイトになればUTF-32でしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: Unicodeテキストファイルをfreadで読み込めない

#7

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

みや さんが書きました: 「そんなことないさ。普通だよ。」と書いてあるUnicodeのテキストファイル(SCENE_DATA_FILE.txt)を読み込んでみると
最後まで読み込めません。実際には「そんなことないさ。普」までしか読み込めていません。

コード:

fe ff 30 5d 30 93 30 6a 30 53 30 68 30 6a 30 44 30 55 30 02
 BOM   そ    ん    な    こ    と    な    い    さ    。  

66 6e 90 1a 30 60 30 88 30 02 00 0d 00 0a
  普   通    だ    よ    。    \r    \n
FILE *f を fopenするとき、"rb" でバイナリモードにしてみたらどうですか?
"r" だと、テキストモードで、0x1a (^Z) は EOF 扱いされて、その直前の
0x90 までしか読めていないのでしょう。

かずま

Re: Unicodeテキストファイルをfreadで読み込めない

#8

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

Little Endian だとこうなっているはずです。

コード:

ff fe 5d 30 93 30 6a 30 53 30 68 30 6a 30 44 30 55 30 02 30
 BOM   そ    ん    な    こ    と    な    い    さ    。
6e 66 1a 90 60 30 88 30 02 30 0d 00 0a 00
  普   通    だ    よ    。    \r    \n
テキストモードの読み込みだと、やはり 0x1a の前の 0x66 までしか読めないのでしょう。

みや

Re: Unicodeテキストファイルをfreadで読み込めない

#9

投稿記事 by みや » 9年前

fopenに渡す引数をrbにしたところうまくいきました。
なるほど、0x1aは EOF 扱いされるのですね。
とても勉強になりました。
皆さん、ありがとうございました。

閉鎖

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