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
No.1
- 回答日時:
strtol()はlong値を返却するのをintで受けていますね。
これは大した問題ではないですが...
変換結果が変数num(実際long値)の最大値を超えているので
結果的strtol()でエラーが発生していると思われます。
strtol()の結果を判定しましょう。
この回答への補足
回答ありがとうございます。
int num;を
long num;に変更してみましたが、結果はかわりませんでした。
------出力結果-------
44DB4147E6075A92E878EB68C44DD51F
7fffffff
5DCE86622D846BF272215A792AF31A3E
7fffffff
46FF69A29D3DF1D4842461B239256C26
7fffffff
---------------------
文字列としての出力はうまくいっているのですが、これを16進数の数値として出力しようとすると
7fffffff
と出力されてしまいます。
もう少し検討してみます。
No.2
- 回答日時:
処理系の情報も何もなくただ「うまくいかない」とだけ言われても判断のしようがありません. この手の質問は「うまくいかないからしている」はずだからです.
「どのようにうまくいかないのか」, 特に「どのような結果を期待したのか」「実際の結果はどうだったのか」を明確に記してください.
この回答への補足
回答ありがとうございます。
すいません。情報不足ですね。補足いたします。
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
という出力結果がでました。
No.3ベストアンサー
- 回答日時:
44DB4147E6075A92E878EB68C44DD51F
5DCE86622D846BF272215A792AF31A3E
46FF69A29D3DF1D4842461B239256C26
これらの16進文字列をビット換算すると128ビットもあります。Cで128ビットも保持できる変数なんてあったかな?
Windows系で半分の64ビットなら_strtoi64を使えば出来るけど、128ビットは・・・
No.4
- 回答日時:
その結果なら #1 のいわれる通りで, 「strtol で変換しようとしたときにオーバフローした」ことが原因です. ちなみにオーバフローしたかどうかは strtol のあとで errno を調べればわかる.
ちなみにだけど「2進数に変換したい」ってどういうことでしょうか? 「2進文字列にしたい」なら意味はありますけど, 「数値」ということだとこのままでは意味ないですよ.
まあもっとも, 「2進文字列にする」だけならわざわざ整数を経由しないか....
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
Cでファイルの行数をカウントす...
-
構造体メンバの初期化
-
C言語のプログラムで、途中で止...
-
プログラミングの授業の課題です
-
C言語で複数列のデータを1列の...
-
fread(),fwrite()等について
-
[C]セグメンテーションエラー:...
-
#defineが使用するメモリ領域に...
-
C++で指定文字列のカウント方法...
-
printf による16進表示について
-
fscanfの使い方
-
マイナスからプラスへ転じた時...
-
「指定されたキャストは有効で...
-
数字以外が入力されたらエラー...
-
C言語で簡単なパックマンゲーム...
-
比較回数と交換回数表示について
-
C言語での引数の省略方法
-
2÷3などの余りについて
-
4の倍数を論理演算で表す。。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
C言語で複数列のデータを1列の...
-
#defineが使用するメモリ領域に...
-
printf による16進表示について
-
空白を含んだ文字列がうまく格...
-
C言語のプログラムで、途中で止...
-
プログラミングの授業の課題です
-
char型2つを結合し、short型に...
-
C言語でのCSVファイルの読み出...
-
矢印キーを押下してコンソール...
-
【C言語】全角文字の配列を、全...
-
エラーについて質問です。
-
リストの作成と出力(C言語)
-
バイナリファイル(画像)のよみ...
-
[C]セグメンテーションエラー:...
-
WinInetのInternetOpenUrl関数...
-
VC++でSQLへSELECT文を送ったの...
-
受信データから必要な部分のみ...
-
c言語で文書を読み込み、単語の...
-
reallocでエラー
おすすめ情報