ファイルの読み込み – 固定ページ 2 – プログラミング – Home

通知
すべてクリア

[解決済] ファイルの読み込み

固定ページ 2 / 5

NGA
 NGA
(@NGA)
ゲスト
結合: 23年前
投稿: 98
 

int main(int argc, char** argv)
{
char fname[68];
char chstr[12];
unsigned char *pstr;
unsigned char mbb_str[3];
int intstr;
FILE* fp;

if(argc < 2 || !(fp = fopen(argv[1], r)))
{
return 2;
}

while(( fgets( chstr,6,fp )) != NULL ){
pstr = (unsigned char *)chstr;

while ( *pstr ) {
memset( mbb_str, 0, sizeof( mbb_str ));
_mbsncpy( mbb_str, pstr, 1);

// intstr = AlphaChange((char *)pstr);//変換処理

// if( intstr == 0){
printf(%s,mbb_str);
// }

pstr = _mbsinc( pstr );
}
}

fclose(fp);

return 0;
}

以上のコードで試すと、
読込ファイル : tEsカサ ギ17;6[R50@eARIGat
出力結果 : tEsカサ ギ17;6[R50@eARIGat
となりましたね。


返信引用
makoto
 makoto
(@makoto)
ゲスト
結合: 23年前
投稿: 50
Topic starter  

NGAさんのように
変換をしないでそのまま表示させているのですが
やはり tEsカサ ギ1V;6[q50@eARIGat
のように「V」「q」がでてきてしまいます。

NGAさんのプログラムをそのまま使って
やってみたのですが
それでも同じ結果になってしまいました。
    


返信引用
makoto
 makoto
(@makoto)
ゲスト
結合: 23年前
投稿: 50
Topic starter  

追加で。

while(( fgets( chstr,6,fp )) != NULL ){
で、うまくいったと思っても
読み込み文字数を変えるとまた違った結果になったりします。


返信引用
NGA
 NGA
(@NGA)
ゲスト
結合: 23年前
投稿: 98
 

文字コード(JIS・S-JIS・EUC・UNICODE)を変えたり、Win98上で動かしてみたりしましたが、
どうしても tEsカサ ギ1V;6[q50@eARIGat を出すことができませんでした。


返信引用
TAKA
 TAKA
(@TAKA)
ゲスト
結合: 23年前
投稿: 117
 

> makotoさんへ

気になったのでよこからですが、
今のメインのみをもう一度省かず、コピーペーストしてくれませんか?
後、テキストファイルだと思われますが、もう一度作成しなおし、ためしても
だめですか?
バイナリ-EDITもっているなら、tEsカサ ギ17;6[R50@eARIGat
のダンプ等があるとわかりやすいです。


返信引用
makoto
 makoto
(@makoto)
ゲスト
結合: 23年前
投稿: 50
Topic starter  

int main(int argc, char* argv[])
{
char fname[68];
char chstr[12];
unsigned char *pstr;
unsigned char mbb_str[3];

FILE *fp;

if (argc == 1) {
printf(ファイル名を入力してください!\n);
printf(ファイル名=);
scanf(%s, fname);
}else{
strcpy(fname, argv[1]);
}

/* ファイルオープン */
fp = fopen(fname, r);
if ( fp == NULL ) {
printf(ファイルオープンに失敗しました);
exit (1);
}

memset( chstr, 0, sizeof(chstr) );
while(( fgets( chstr, 6, fp )) != NULL ){
pstr = (unsigned char *)chstr;

while ( *pstr ) {
memset( mbb_str, 0, sizeof( mbb_str ));
//strncpy( (char *)mbb_str, (char *)pstr,1);
_mbsncpy( mbb_str, pstr, 1);

printf(%s,mbb_str);

pstr = _mbsinc( pstr );
}
memset( chstr, 0, sizeof(chstr) );
}

fclose(fp);
return 0;
}

メインはこれです。
テキストファイルは作りなおしてみましたが
やはり結果は同じでした。

なにか原因があるのでしょうか?


返信引用
NGA
 NGA
(@NGA)
ゲスト
結合: 23年前
投稿: 98
 

う~む、でませんねぇ。
makotoさんの方法で注意しなければいけない点は、ファイルから読み込んだ時に
全角文字が先行バイトと後続バイトに分断された場合のみくらいかと考えていましたが。


返信引用
TAKA
 TAKA
(@TAKA)
ゲスト
結合: 23年前
投稿: 117
 

> makotoさんの方法で注意しなければいけない点は、ファイルから読み込んだ時に
> 全角文字が先行バイトと後続バイトに分断された場合のみくらいかと考えていましたが。

私もそう思いメインを出してもらったのですが出ませんでした。

> while(( fgets( chstr, 6, fp )) != NULL ){
> pstr = (unsigned char *)chstr;
>
> while ( *pstr ) {
> memset( mbb_str, 0, sizeof( mbb_str ));
> //strncpy( (char *)mbb_str, (char *)pstr,1);
> _mbsncpy( mbb_str, pstr, 1);
>
> printf(%s,mbb_str);
>
> pstr = _mbsinc( pstr );
> }
> memset( chstr, 0, sizeof(chstr) );
> }

ためしですが、下記の2パターンにこの部分を変えてみてください

パターン1:
while(( fgets( chstr, 6, fp )) != NULL ){
pstr = (unsigned char *)chstr;
printf(%s,pstr);
memset( chstr, 0, sizeof(chstr) );
}

パターン2:
char wk[3];
while(( fgets( chstr, 6, fp )) != NULL ){
pstr = (unsigned char *)chstr;

memset( wk, 0x00, sizeof( wk ));
while ( *pstr ) {
memset( mbb_str, 0, sizeof( mbb_str ));
//strncpy( (char *)mbb_str, (char *)pstr,1);
_mbsncpy( mbb_str, pstr, 1);

if (wk[0] != 0x00) {
wk[1] = mbb_str;
printf(%s,wk);
memset( wk, 0, sizeof( wk ));
}
else if ((mbb_str & 0x80) == 0x80) {
wk[0] = mbb_str;
}
else {
printf(%s,mbb_str);
}

pstr = _mbsinc( pstr );
}
memset( chstr, 0, sizeof(chstr) );
}


返信引用
TAKA
 TAKA
(@TAKA)
ゲスト
結合: 23年前
投稿: 117
 

すみませんパターン2ですが、
mbb_str -> mbb_str[0]
としてください。
多分動かないとおもうのですが・・・。


返信引用
makoto
 makoto
(@makoto)
ゲスト
結合: 23年前
投稿: 50
Topic starter  

パターン2の
else if ((mbb_str & 0x80) == 0x80) {
で以下のようなエラーが出ました。

error C2296: '&' : 不正な左オペランドです。


返信引用
NGA
 NGA
(@NGA)
ゲスト
結合: 23年前
投稿: 98
 

>パターン2の
>else if ((mbb_str & 0x80) == 0x80) {
>で以下のようなエラーが出ました。
>
>error C2296: '&' : 不正な左オペランドです。

これもTAKAさんが一つ上で書いているように修正ですか?


返信引用
makoto
 makoto
(@makoto)
ゲスト
結合: 23年前
投稿: 50
Topic starter  

>mbb_str -> mbb_str[0]

これはどこと置きかえるのですか?


返信引用
TAKA
 TAKA
(@TAKA)
ゲスト
結合: 23年前
投稿: 117
 

すみません上にも書きましたが、
mbb_str -> mbb_str[0]
としてください。
又、wk はunsigned char でお願いしますm(__)m


返信引用
TAKA
 TAKA
(@TAKA)
ゲスト
結合: 23年前
投稿: 117
 

if (wk[0] != 0x00) {
wk[1] = mbb_str[0];
printf(%s,wk);
memset( wk, 0, sizeof( wk ));
}
else if ((mbb_str[0] & 0x80) == 0x80) {
wk[0] = mbb_str[0];
}
else {
printf(%s,mbb_str);
}
です。たびたびすみません。


返信引用
makoto
 makoto
(@makoto)
ゲスト
結合: 23年前
投稿: 50
Topic starter  

パターン2を試したところ
tEsカサ ギ1V;6[q50@eARIU
と言うような結果が返ってきました。

やはり同じようなところで違う結果が返ってきています。
むー。なぜ??


返信引用
固定ページ 2 / 5

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました