C言語を初めてかなり長い年月が経っておりますが、
「ファイルから読み込んだワイド文字を表示できない」という
初歩的な問題に悩んでおります。
以下にソースを載せてありますので、誤りを教えて頂けると
大変嬉しいです。
処理内容は、
(1) Test.txt へ文字"ABC"を出力
(2) Test.txtから文字列を読み込み表示
です。
============================================
#include <stdio.h>
#include <locale.h>
void main()
{
FILE *pFileOut = NULL;
FILE *pFileIn = NULL;
::_wsetlocale(LC_ALL, L"");
if(::_wfopen_s(&pFileOut, L"Test.txt", L"w,ccs=UTF-16LE") == 0)
{
::fwprintf(pFileOut, L"%s", L"ABC");
::fclose(pFileOut);
}
if(::_wfopen_s(&pFileIn, L"Test.txt", L"r") == 0)
{
unsigned char cBOM[2];
wchar_t szString[100];
cBOM[0] = ::fgetc(pFileIn);
cBOM[1] = ::fgetc(pFileIn);
printf("%02x%02x\n", cBOM[0], cBOM[1]);
::fwscanf(pFileIn, L"%s", szString);
::wprintf(L"[%s]\n", szString);
::fclose(pFileIn);
}
}
============================================
ちなみに、作成されたファイルのバイナリは以下の通りになっております。
ff fe 41 00 42 00 43 00
また、実行結果は以下の通りになっております。
fffe
[A]
以上よろしくお願い致します。
No.4ベストアンサー
- 回答日時:
理由はわからんが %S.
回答有難うございます。
早速、%S に変更し実行してみました。
いろいろ実行してみた結果、
【結果】
::fwscanf(pFileIn, L"%s", szString);
を
::fwscanf(pFileIn, L"%S", szString);
に変更するのみで、[ABC]が正しく表示されました。
(wprintf()は変更せず、%sを指定)
有難うございました。
でも、なぜ fwscanf() だけ %S にする必要があるのか、疑問は残りますが。。
No.3
- 回答日時:
忘れてたけど、printfも「wchar_t型の文字列を指定する場合は、%lsを使う」ので注意。
::fwscanf(pFileIn, L"%s", szString);
::wprintf(L"[%s]\n", szString);
の2行を
::fwscanf(pFileIn, L"%ls", szString);
::wprintf(L"[%ls]\n", szString);
に直せばオッケーです。
printfの方が%sのままだったら、折角正しく読み込めても、charの文字列だと思われて、ちゃんと表示されません。
早速の回答有難うございます。
ご指摘通り、%s を %ls へ変更して実行しましたが、結果は以下の通り同じでした。
fffe
[A]
私は、以下の様に表示されるのを期待しているのですが間違っているのでしょうか?
fffe
[ABC]
補足として、開発環境は以下の通りです。
Windows7/64bit - Visual Studio 2010 Professional.
No.1
- 回答日時:
>wchar_t szString[100];
>::fwscanf(pFileIn, L"%s", szString);
wscanfは、wchar_t型の文字配列に文字列を読み込む場合は、%sではなく%lsを使う。
char szCString[100];
char szWString[100];
:fwscanf(pFileIn, L"%s", szCString);
:fwscanf(pFileIn, L"%ls", szWString);
上記のように、書式指定子にlがあるかないかで、格納先の配列の型が異なるので注意。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
%dなどの違い
-
TCL言語で文字列検索方法を教え...
-
プログラムによく出てくるst...
-
C#でstringをポインタとして渡す
-
_tcscpy_s(wcscpy_s)の第二引数...
-
VB6.0でのバイナリデータの扱い...
-
char型配列の最大要素数
-
Cで二次元配列の読み込み
-
C++で入力した文字列から数字を...
-
シリアル通信で0x00を送信した...
-
VBA-DLLの引数受け渡しについて
-
sprintf関数での文字列変換につ...
-
アルファベットをカウント、
-
AnsiStringについて
-
C言語についてです学籍番号、名...
-
[Excel VBA]デフォルトプロパティ
-
構造体→文字列→構造体 をする方法
-
PIC18F26K22でsscanf関数を使い...
-
16進数を2文字ずつ配列に格納し...
-
こんなことって可能なのですか...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C++で入力した文字列から数字を...
-
nullと""、\\0とEOFの違いにつ...
-
プログラムによく出てくるst...
-
%dなどの違い
-
WSH(VBS)でJSONの文字列を読み...
-
TCL言語で文字列検索方法を教え...
-
C#でstringをポインタとして渡す
-
16進数を2文字ずつ配列に格納し...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
C++で文字列の右端から特定の文...
-
シリアル通信で0x00を送信した...
-
VBA-DLLの引数受け渡しについて
-
数字の入った配列をファイルへ...
-
c#で他のアプリの文字入力フォ...
-
構造体→文字列→構造体 をする方法
-
Shift_JIS(16進)を文字に変換す...
-
バイナリファイル中の日本語文...
-
C言語の課題で困っています;
-
[C++]WCHARの1文字目しか表示で...
-
VB6.0でのバイナリデータの扱い...
おすすめ情報