- ベストアンサー
C言語にてテキストファイル内の16進数計算
お世話になります。 私自身開発経験が一度もなく、また難しいといわれているC言語に挑戦を試みている者ですが、最後までお付き合いのほどをお願いします。なお、実際作れるプログラムはprintf関数程度しか使ったことが御座いませんので、下名にて情報提供する事が出来ないことが多くご迷惑おかけするかも知れませんが予めご理解お願いします。 では本題の質問ですが、テキストファイル内に下記のような行があります。 ファイル名「1.txt」 NAME = "xxx" /* 名前 ・・・(1) ADDRES = "004E3742" /* 16進数 目的 = "足し算" /* 目的 ・・・・・ ・・・・・ NAME = "yyy" /* 名前 ADDRES = "004E374F" /* 16進数 目的 = "足し算" /* 目的 ・ ・ NAME = "zzz" /* 名前 ADDRES = "00500000" /* 16進数 目的 = "足し算" /* 目的 ・ このように永遠に書き続けられたところで ADDRESの行の""に囲まれた16進数に、決まった16進数を加算した合計を同じ1.txtファイルに書き込むプログラム作成を考えております。 例 (1) 16進数3E45を加算と仮定 NAME = "xxx" /* 名前 ADDRES = "004E7587" /* 16進数004E3742+3E45されている 目的 = "足し算" /* 目的 ・ ・ /* この後もADDRESを見つけ次第3E45を加算するプログラム のような結果を求めております。 ファイル操作の説明書や数ある参考書、WEBを見ても文字列の一括変換やその類のソフトは多数御座いましたが、希望する情報やソフトは御座いませんでしたので自分で作ってみようと思いました。 下名の勉強のためですのでせめて関数や、サンプルプログラム、もしくは説明されているWEBページなどをご紹介いただけると幸いです。なにとぞよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
サンプルプログラムを作ってみました。あくまでサンプルなので、エラー処理などは省いてあります。本当は関数の戻り値などをちゃんと調べて、実行がちゃんとできたか(fopenとかunlinkとか)調べてやらないといけません。 データのフォーマットは固定だとして処理しています。 空白の並びは、1つ以上でも良い場合などもっと柔軟な場合は、もっとパターンチェックをしないといけません。 あと、/*以降はコメントだとして、変更出力時には、無視されています。 それぞれの関数などについては調べてみてください ------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> void main(void){ FILE *fi, *fo; char buff[128], wk[16]; unsigned long address; fi=fopen("1.txt", "r"); fo=fopen("1.txt.new", "w");/* 出力用ファイル */ while(NULL!=fgets(buff,128, fi)){/* 行毎の読み取り */ /* 調べたい行の様式(固定) ADDRES = "HHHHHHHH" */ if(0==strncmp("ADDRES = \"",buff,10)){/* 行の先頭10バイトが指定された様式か? strncpy(wk,buff+10,8);/* 16進8桁をとりだす */ wk[9]='\0'; address=strtoul(wk, NULL, 16);/* 16進文字列を数値に変換 */ fprintf(fo, "ADDRES = \"%08X\"\n",address+0x03E45);/* +して出力 */ } else { fprintf(fo,"%s",buff);/* 他の行はそのまま出力 */ } } fcloseall();/* 全ての開いたファイルを閉じる */ unlink("1.txt"); /* 元のファイルを削除する */ rename("1.txt.new","1.txt"); /* 出力ファイルの名前を変更する */ }
その他の回答 (2)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#2で /* 行の先頭10バイトが指定された様式か? のコメントが閉じていませんでした。 /* 行の先頭10バイトが指定された様式か? */ のように閉じてください。
- pchan0022000
- ベストアンサー率42% (112/261)
ファイルの入出力はできるとして(出来ないならC言語 ファイル入出力辺りでググッてください)、sscanfとsprintf使えばできるんじゃないですかね。 とりあえずC言語辞書は持っておくことをお勧めします。 http://www.amazon.co.jp/exec/obidos/ASIN/4774104329/249-5869090-3347526
お礼
何から何までご丁寧にサンプルまで頂き真にありがとう御座いました。実行の結果うまく作動いたしましたm(_)m 教えていただいたソースを参考にし、スキルアップを目指したく存じます。今後ともよろしくお願いします。