お世話になります。
私自身開発経験が一度もなく、また難しいといわれている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ページなどをご紹介いただけると幸いです。なにとぞよろしくお願いします。
No.2ベストアンサー
- 回答日時:
サンプルプログラムを作ってみました。
あくまでサンプルなので、エラー処理などは省いてあります。本当は関数の戻り値などをちゃんと調べて、実行がちゃんとできたか(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"); /* 出力ファイルの名前を変更する */
}
No.3
- 回答日時:
#2で
/* 行の先頭10バイトが指定された様式か?
のコメントが閉じていませんでした。
/* 行の先頭10バイトが指定された様式か? */
のように閉じてください。
何から何までご丁寧にサンプルまで頂き真にありがとう御座いました。実行の結果うまく作動いたしましたm(_)m
教えていただいたソースを参考にし、スキルアップを目指したく存じます。今後ともよろしくお願いします。
No.1
- 回答日時:
ファイルの入出力はできるとして(出来ないならC言語 ファイル入出力辺りでググッてください)、sscanfとsprintf使えばできるんじゃないですかね。
とりあえずC言語辞書は持っておくことをお勧めします。
http://www.amazon.co.jp/exec/obidos/ASIN/4774104 …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 3 2022/10/04 15:07
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Excel(エクセル) 列を自動で追加したい 3 2022/07/11 12:58
- その他(プログラミング・Web制作) 入力フォームへ、データを自動的に入力するプログラム。どうやって作る? 4 2023/01/16 10:24
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイル出力の場所を指定
-
VC++でUTF-8のファイルを出力し...
-
二次元配列をクリップボードに...
-
テキストファイルに改行コード...
-
CreateProcess関数と実行後の戻...
-
C言語での印刷方法
-
構造体のファイル出力
-
ファイルの文字コードをUTF-8に...
-
VB.NETでExcelファイルを出力す...
-
ファイル形式またはファイル拡...
-
プリンタに出力する信号をパソ...
-
Base64でエンコードした後の文...
-
サウンド出力のデバイスを選択...
-
C++ BuilderでPDF出力
-
コマンド(例えばls)の出力結果...
-
Accessでのレポート印刷待機方法
-
setvbufってどう使うの?
-
C言語のローカル変数初期化に...
-
FORTRANの出力データの左寄せが...
-
C言語での出力の上書き方法を教...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンド(例えばls)の出力結果...
-
Acccess レポートをグループ別...
-
VC++でUTF-8のファイルを出力し...
-
サウンド出力のデバイスを選択...
-
ファイルの文字コードをUTF-8に...
-
VBA でメモ帳へ保存する際の保...
-
ファイル出力の場所を指定
-
ファイル形式またはファイル拡...
-
テキストファイルに改行コード...
-
シェルコマンドの 2>&1 とはど...
-
Wordマクロで指定したフォルダ...
-
AccessVBA複数レポート条件毎に...
-
二次元配列をクリップボードに...
-
UNIX & Linux の標準出力で得た...
-
フォルダにあるPDF情報の抽出(VBA)
-
C++ BuilderでPDF出力
-
VBSでEXCEL⇒CSV変換で日付の書...
-
fortranのtxtファイル出力書式...
-
CBool関数について VB6とVB.net...
-
ワードからPDF変換でグラフが表...
おすすめ情報