- ベストアンサー
ファイルから文字列を読み出して16進数に変換
test1.txtというファイルから文字列を読み出して16進数に変換、という処理をしたいのですがうまくいきません。どこがどう悪いのでしょうか?ご教授のほどお願いします。 ---------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { FILE *fp; char *fname = "test1.txt"; char str[100]; int num; fp = fopen( fname, "r" ); if( fp == NULL ){ printf( "%s is not open.\n", fname ); return -1; } while( fgets(str, 100, fp ) != NULL ){ num = strtol(str, NULL, 16); printf( "%s", str ); printf("%x\n", num); //ここでうまく出力されません } fclose( fp ); return 0; } ---------------- ちなみに、test1.txtの中身は以下のようになってます。 44DB4147E6075A92E878EB68C44DD51F 5DCE86622D846BF272215A792AF31A3E 46FF69A29D3DF1D4842461B239256C26
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
44DB4147E6075A92E878EB68C44DD51F 5DCE86622D846BF272215A792AF31A3E 46FF69A29D3DF1D4842461B239256C26 これらの16進文字列をビット換算すると128ビットもあります。Cで128ビットも保持できる変数なんてあったかな? Windows系で半分の64ビットなら_strtoi64を使えば出来るけど、128ビットは・・・
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
その結果なら #1 のいわれる通りで, 「strtol で変換しようとしたときにオーバフローした」ことが原因です. ちなみにオーバフローしたかどうかは strtol のあとで errno を調べればわかる. ちなみにだけど「2進数に変換したい」ってどういうことでしょうか? 「2進文字列にしたい」なら意味はありますけど, 「数値」ということだとこのままでは意味ないですよ. まあもっとも, 「2進文字列にする」だけならわざわざ整数を経由しないか....
お礼
回答ありがとうございました。 エラーの原因がわかりました。またいろいろ試してみようと思います。
- Tacosan
- ベストアンサー率23% (3656/15482)
処理系の情報も何もなくただ「うまくいかない」とだけ言われても判断のしようがありません. この手の質問は「うまくいかないからしている」はずだからです. 「どのようにうまくいかないのか」, 特に「どのような結果を期待したのか」「実際の結果はどうだったのか」を明確に記してください.
補足
回答ありがとうございます。 すいません。情報不足ですね。補足いたします。 while( fgets(str, 100, fp ) != NULL ){ num = strtol(str, NULL, 16); printf( "%s", str ); //読み込んだ文字列の確認 printf("%x\n", num); //文字列を16進数に変換した値を出力し確認 上記の部分なんですが、while文の条件のところで文字列を1行読み込み、 次の行で、読み込んだ文字列を16進数に変換しnumに代入、という処理を行ったつもりです。 期待した実行結果は、 44DB4147E6075A92E878EB68C44DD51F <--文字列 44DB4147E6075A92E878EB68C44DD51F <--16進数 でしたが、実際には 44DB4147E6075A92E878EB68C44DD51F 7fffffff 5DCE86622D846BF272215A792AF31A3E 7fffffff 46FF69A29D3DF1D4842461B239256C26 7fffffff という出力結果がでました。
- kent_a
- ベストアンサー率18% (36/199)
strtol()はlong値を返却するのをintで受けていますね。 これは大した問題ではないですが... 変換結果が変数num(実際long値)の最大値を超えているので 結果的strtol()でエラーが発生していると思われます。 strtol()の結果を判定しましょう。
補足
回答ありがとうございます。 int num;を long num;に変更してみましたが、結果はかわりませんでした。 ------出力結果------- 44DB4147E6075A92E878EB68C44DD51F 7fffffff 5DCE86622D846BF272215A792AF31A3E 7fffffff 46FF69A29D3DF1D4842461B239256C26 7fffffff --------------------- 文字列としての出力はうまくいっているのですが、これを16進数の数値として出力しようとすると 7fffffff と出力されてしまいます。 もう少し検討してみます。
お礼
回答ありがとうございます。 上記では16進数に変換までの記述ですが、実際にはこそからさらに2進数に変換したいんです。