|
ええと、前回ファイルの取り扱いやmallocで騒いでた者です。初心者のうちにおもっきしこの掲示板利用させていただきます!
本題:
とりあえず一通りは出来てるのですがメモリの解放しようとするとエラーが出ます。(解放しなければ「表面上」は正常動作)⇒「DAMAGE:After normal block (#64) at(メモリのアドレス)」
調べたところmalloc後、またはWhileブロック内でのrealloc後もWhileブロック後もメモリのアドレス変わってません。(なので他関数は不必要と勝手に判断しました。所望された場合は随時載せていこうかと思います。長い、というのもあるので。(350行程度ですが))
とりあえずそのうち一通りのアドバイスを仰ぐために全プログラム丸投げするつもりですが今回は必要最低限なmain部のみでアドバイスよろしくお願いします。
補足:
プログラムの流れとしてはファイル内の文字列置換をリストに従って行う、というものです。
元ファイル・置換用Listファイルの中身をメモリに展開⇒メモリに展開したListファイルから1行を読み込んで置換前後文字列に分解し、置換対象ファイルの中から置換対象文字列検索⇒置換⇒result.txtファイルに書き込む、という流れになってます。
あとプログラムには直接関係ないのですが、完成したらここに全部ぺたっとはっつけて「改善の余地あったらおしえてー!」って感じの書き込みってしてもいいんでしょうか?(だめならあっさり引き下がります(笑))
「普通ならこんなやり方しない」とか「そうやると非効率だ」とかいうコメントが欲しいのです・・・。
では、長くなりましたがヨロシクオネガイシマス!
int main()
{
//元ファイルのサイズ
int oriSize;
//リストファイルの1行保存
char listChar[MAX_LINE];
//元ファイルの内容 staticつけても変化無し(Whileブロック内で変化した場合のアドレス値保持のためstatic)
static char *content;
//リストファイル内容の処理用。
int count=0;
//file name格納
char oriFName[FILE_NAME];
char listFName[FILE_NAME];
inFName(oriFName,"元ファイル");
inFName(listFName,"リストファイル");
oriSize = getFileSize(oriFName);
content = (char *)calloc(oriSize,sizeof(char));
if(content==NULL)
{
error("領域確保失敗");
}
readAllInFile(oriFName,content,oriSize);
int lineNo=1;
char *tempCont;
while(getaLine(listChar,listFName,lineNo)== NEXT)
{
char *before;
char *after;
int amount;
int gap;
int times;
tempCont = (char *)calloc(oriSize,sizeof(char *));
before = strtok(listChar,SEPARATE);
after = strtok(NULL,SEPARATE);
//1回の置換に生じる置換前・置換後のサイズ変化
gap=checkAndCal(listChar,before,after,lineNo);
//何度置換が生じるかのチェック
times = calTimes(before,content);
//その結果、生じるファイルサイズ差
amount = times * gap;
//置換後のファイルのサイズ
amount += strlen(content);
strcpy(tempCont,content);
content = (char *)realloc(content,amount);
changeW(before,after,tempCont,gap);
strcpy(content,tempCont);
++lineNo;
}
free(tempCont);
writeAllInFile("result.txt",content,strlen(content));
//解放するとエラー。Whileブロック内でも同様 free(content);
return 0;
}
|