プロが教える店舗&オフィスのセキュリティ対策術

C言語を始めて1ヶ月程度の初心者です。
10進数のデータファイル(.txt形式)を取り込んで16進数に変換を行い、その結果を同じ形式のファイルを出力するプログラムを作成しております。
下記の様にプログラムを作成した所、"printf"で出力された値(モニタ画面)は問題ありませんが、肝心の"fprint"で出力したファイルの記述内容が"printf"の値と一致しておりません。

1.作成したプログラム
//10進数データ入力→16進数に変換
//変換結果をファイルに出力
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//基本設定
int main(void) {
FILE *FP,*FPI,*FPO;
//処理数値設定
char str[100];
char *word[2];
int *dec[2];
//ファイル記述:列数
int loop;
int size = 2;
/*
printf("書き込み中\n");
//事前準備スタート
FP = fopen("Dec_data.txt", "w");
fputs("9999 500\n22 8000\n", FP);
fclose(FP);
printf("書き込み完了\n");
//事前準備終了
*/
//Output
if ((FPI = fopen("Dec_data.txt", "r")) != NULL) {
while (fgets(str, 100, FPI) != NULL) {
//文字列をスペースにて分割
word[0] = strtok(str, " ");
word[1] = strtok(NULL, " ");
//文字列を数値データに変換(dec[]=int:整数)
dec[0] = atoi(word[0]);
dec[1] = atoi(word[1]);
//10進数→16進数に変換(4桁指定出力の場合:空き桁に"0"を出力)
printf("%04x %04x\n", dec[0], dec[1]);
}
}
//結果をファイル(txt形式)に出力
if ((FPO = fopen("Hex_data.txt", "w")) != NULL) {
for (loop = 0; loop < size; loop++) {
fprintf(FPO, "%04x %04x\n", dec[0], dec[1]);
}
}
fclose(FPO);
fclose(FPI);
return 0;
}

2.読み込むファイルの内容(Dec_data.txt)

9999 500
22 8000

3."printf"での結果(問題なし)

270f 01f4
0016 1f40

4.出力ファイルの結果(Hex_data.txt)

0016 1f40
0016 1f40

"printf"の結果と一致した値が出力ファイルの値として記述されてほしいのですがどうすればよいのでしょうか?
回答よろしくお願いいたします。

A 回答 (2件)

以下のようにしてください。


修正個所は、//追加、//変更のコメントをいれてます。

//10進数データ入力→16進数に変換
//変換結果をファイルに出力
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//基本設定
int main(void) {
FILE *FP,*FPI,*FPO;
//処理数値設定
char str[100];
char *word[2];
int dec[2][2]; //変更
//ファイル記述:列数
int loop;
int size = 2;
/*
printf("書き込み中\n");
//事前準備スタート
FP = fopen("Dec_data.txt", "w");
fputs("9999 500\n22 8000\n", FP);
fclose(FP);
printf("書き込み完了\n");
//事前準備終了
*/
//Output
if ((FPI = fopen("Dec_data.txt", "r")) != NULL) {
loop = 0; //追加
while (fgets(str, 100, FPI) != NULL) {
//文字列をスペースにて分割
word[0] = strtok(str, " ");
word[1] = strtok(NULL, " ");
//文字列を数値データに変換(dec[]=int:整数)
dec[0][loop] = atoi(word[0]); //変更
dec[1][loop] = atoi(word[1]); //変更
//10進数→16進数に変換(4桁指定出力の場合:空き桁に"0"を出力)
printf("%04x %04x\n", dec[0][loop], dec[1][loop]); //変更
loop++; //追加
}
}
//結果をファイル(txt形式)に出力
if ((FPO = fopen("Hex_data.txt", "w")) != NULL) {
for (loop = 0; loop < size; loop++) {
fprintf(FPO, "%04x %04x\n", dec[0][loop], dec[1][loop]); //変更
}
}
fclose(FPO);
fclose(FPI);
return 0;
}
--------------------------
2つのデータが2行あるので、データは4つあります。
これを全て記憶するには、
int dec[2];では足りません。
int dec[2][2];のようにします。
もし、100行のデータを記憶するなら
int dec[2][100];
のようにしてください。
    • good
    • 0
この回答へのお礼

なるほど!行のデータを記憶する項目を追加するのですね!上記の様に記述を行ったところ狙い通りのファイルの書き込みができました!ありがとうございます!

お礼日時:2017/10/02 20:42

>int *dec[2];


で用意しているのはポインタの配列ですが意図したものなんですかね?
# ポインタとして参照していないので動作はしているようですが。


>肝心の"fprint"で出力したファイルの記述内容が"printf"の値と一致しておりません。

printf()とfprintf()の実行タイミングに注意しましょう。
printf()はファイルの読み込みループ『中』です。
が、fprintf()の読み込み『終了後』です。
dec配列に入っているのは『最後に設定した値』です。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!