掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.28021

strcatでの出力ファイル名結合
投稿者---ナトー(2006/09/03 12:53:24)


質問です。

引数としてファイル名とファイルポインタを受け取り、
その入力ファイルにある処理を行ったものを出力ファイルに書き込む、
というプログラムを作っているのですが、
出力ファイル名を"out_ファイル名"とするためにstrcat関数を使って
strcat(outfile,name) //outfile="out_",nameは入力ファイル名
としてfopenで開こうとするとセグメンテーションエラーが起きてしまいます。
どうすれば出力ファイル名を"out_ファイル名"とすることができるでしょうか?
どなたか分かる方教えて下さい。お願いします。
以下が作成中のコードです。
void vis(char *name,FILE *fin)
{
FILE *fout;
int c, i;
char buf[BUFSIZ], *outfile="out_";

strcat(outfile,name);   //ここに問題あり?

if((fout=fopen(outfile,"w"))==NULL){
printf("cannot open file!\n");
}

do{
for(i=0; (c=getc(fin)) != EOF ;){
if(!isprint(c)){
fprintf(fout,"\\X%X",c);
break;
}
buf[i++]=c;
if(i >= BUFSIZ)
break;
}
if(i >= MINLEN)
fprintf(fout,"%.*s\n",i, buf);
}while (c != EOF);

fclose(fout);
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:strcatでの出力ファイル名結合 28022 επιστημη 2006/09/03 13:18:08
<子記事> Re:strcatでの出力ファイル名結合 28023 Blue 2006/09/03 13:31:06
<子記事> Re:strcatでの出力ファイル名結合 28024 ナトー 2006/09/03 13:56:23
<子記事> Re:strcatでの出力ファイル名結合 28025 nano 2006/09/03 14:11:06


No.28022

Re:strcatでの出力ファイル名結合
投稿者---επιστημη(2006/09/03 13:18:08)


>出力ファイル名を"out_ファイル名"とするためにstrcat関数を使って
>strcat(outfile,name) //outfile="out_",nameは入力ファイル名
>としてfopenで開こうとするとセグメンテーションエラーが起きてしまいます。
>どうすれば出力ファイル名を"out_ファイル名"とすることができるでしょうか?

結合によって作られるより長い文字列を格納するに十分な領域を用意しないからです。

char out[N]; /* Nはテキトーに大きい */
strcpy(out,"hello,");
strcat(out,"world.");



この投稿にコメントする

削除パスワード

No.28023

Re:strcatでの出力ファイル名結合
投稿者---Blue(2006/09/03 13:31:06)


>char buf[BUFSIZ], *outfile="out_";
>
>strcat(outfile,name);   //ここに問題あり?

char* outfile = "out_";
は書き換え不能の領域で、しかも領域が5文字分しかありません。

strcatは outfile の5文字目の '\0' を書き換えますし、領域も + nameの文字数 分必要になります。

ですので、書き換え可能で、領域が十分ある配列として outfile を宣言してください。

char outfile[ 256 ] = "out_";
strcat( outfile, name );



ソースを載せるときは、「HTML変換ツール」を使ってください。


この投稿にコメントする

削除パスワード

No.28024

Re:strcatでの出力ファイル名結合
投稿者---ナトー(2006/09/03 13:56:23)


επιστημηさん、Blueさん、早速のアドバイスありがとうございます。

宣言部で文字列を指定するとその文字数+NULL分の領域が確保されてしまうんですね。
すごく基本的なことでした。
ありがとうございました。


この投稿にコメントする

削除パスワード

No.28025

Re:strcatでの出力ファイル名結合
投稿者---nano(2006/09/03 14:11:06)


strcatとは別の件です。

出力ファイルのオープンに失敗したとき、処理を中断せずに
入力ファイルからの読み取りと出力ファイルへの書き込みを
行なおうとしていますので、破綻しそうです。


この投稿にコメントする

削除パスワード

No.28026

Re:strcatでの出力ファイル名結合
投稿者---ナトー(2006/09/03 14:59:01)


そうですね。うっかりしてました。
fopenに成功した場合の処理(do-while文)をelseの中に入れれば多分大丈夫ですね。


この投稿にコメントする

削除パスワード

No.28027

Re:strcatでの出力ファイル名結合
投稿者---nano(2006/09/03 15:23:38)


プログラムの仕様上許されるのでしたら、
・vis関数の戻り値をvoidではなくint型あたりにする
・ファイルの入出力が成功裏に終われば、呼び出し元へその旨教える
(例:戻り値0でリターンする)
・ファイルのオープンなどに失敗した場合は、呼び出し元へその旨教える
(例:戻り値1でリターンする)
という風にする方がより安全ではないかと思います。

呼び出し元では、vis関数からの戻り値に応じて、処理を継続するのか
中断するのか、という判断ができるようになります。

プログラムの仕様上どうしてもできない、
もしくはそこまでする必要性を感じない、
ということでしたら、読み捨ててください。


この投稿にコメントする

削除パスワード

No.28028

Re:strcatでの出力ファイル名結合
投稿者---ナトー(2006/09/03 16:55:07)


なるほど、まだまだ甘いですね。
参考にしてみます。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧