ここから本文です

<プログラミングのセグメントエラーに関して>

Gさん

2011/8/1814:06:48

<プログラミングのセグメントエラーに関して>

こんにちは。大学でプログラミングをやっている学生です。
この夏休みは部活以外にも、後期セメスターに向けてのプログラミングの学習を
行っているのですが、途中で詰まってしまいました。

課題の内容としては、

ファイル名"gifts.dat"と必要なデータ数(商品のコード、商品名、値段 の3つで1データ)を入力し、
"present.txt"という新たなファイルに、入力されたデータ分だけ、
"gifts.dat"のデータを書き込む。

というものです。

実行してみた結果、入力したその直後にセグメントエラーが出るのですが、
その理由がわかりません。どうか教えて下さい。

(ソースコード)

#include<stdio.h>
#include<stdlib.h>

#define BUFFER 256

//giftという型名の構造体を作成します
typedef struct{
char code[10];
char name[20];
char price[10];
} gift;

int main(){

FILE *r_fp;
FILE *w_fp;
gift *gift;
char data[BUFFER],f_name[BUFFER];
int d_number,i;

//入力箇所
printf("必要なデータの数・-->");
fgets(data,BUFFER,stdin);
d_number=atoi(data);

printf("読み込むファイルの名前-->");
fgets(f_name,BUFFER,stdin);

/*この記述を消すと、セグメントエラーの表示が出ます
この記述を残すとifが実行されます*/

if((r_fp=fopen(f_name,"r"))==NULL){
printf("ファイルオープン失敗n");
return -1;
}

//書き込み用ファイルのオープン(生成)
w_fp=fopen("present.txt","w");

//giftの動的メモリ確保
gift=(gift *)malloc(sizeof(gift)*d_number);

if(gift==NULL){
printf("メモリ不足\n");
return -1;
}

for(i=0;i<d_number;i++){
fscanf(r_fp,"%s",gift[i].code);
fprintf(w_fp,"%s\t",gift[i].code);

fscanf(r_fp,"%s",gift[i].name);
fprintf(w_fp,"%s\t",gift[i].name);

fscanf(r_fp,"%s",gift[i].price);
fprintf(w_fp,"%s\n",gift[i].price);
}
free (gift);
fclose(r_fp);
fclose(w_fp);

return 0;
}

閲覧数:
1,131
回答数:
2
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

2011/8/1913:59:31

コンパイルを通らないプログラムを実行できたとはこれいかに。

/*この記述を消すと、セグメントエラーの表示が出ます
この記述を残すとifが実行されます*/
ifが実行されて、制御可能なエラーがセグメントエラーみたいな制御不能なエラーになるのを防いでいたわけ。

if((r_fp=fopen(f_name,"r"))==NULL){
printf("ファイルオープン失敗n");
return -1;
}
大抵は「そんなファイルありません」ってことでオープン失敗になるでしょう。というのは、その上を見ると
fgets(f_name,BUFFER,stdin);
fgetsは改行コードまで取り込みます。通常、名前に改行コードの入ったファイル名なんてありませんからここは必ずエラーになります。

このエラー防止機構を消しちゃって、失敗したfopenで得られた無効なr_fpをファイル処理の関数に与えたからセグメントエラーなんでしょう。

質問した人からのコメント

2011/8/21 01:14:31

なるほどです。助かりました、ありがとうございます。

ベストアンサー以外の回答

1〜1件/1件中

ecl********さん

2011/8/1913:25:46

CPUとOSが一般人には必要性の感じられない「セグメント」なるものを勝手に作ってチェックしています。
範囲外を参照すると「セグメントエラー」になります。
セグメントのないCPUで実行すれば「セグメントエラー」にはなりません。

私にもなぜ「セグメント」があるか分かりません。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる