質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • C++

    3435questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

変数をファイル名に入れたファイルの生成がうまくいかない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 562

Poi_Poi

score 3

前提・実現したいこと

x,yの2つの座標を持つ点をxの値で並べ替えた後に、xの値がMAXとMINの間を10等分した範囲にあるものでそれぞれファイルを生成したい。

データの例

1.1200000000000045    159.72083333333333
-2.7933333333333508    29.30048888888889
10.689999999999998    110.30972222222222
-5.396666666666647    47.88305555555556
-3.9833333333333485    16.589733333333335
21.29666666666668    103.66012222222223
-5.133333333333383    18.155822222222223
-4.853333333333353    21.393155555555555
1.160000000000025    44.233155555555555
12.49666666666667    31.538622222222223


これが16000行あります

発生している問題・エラーメッセージ

並べ変えた後のすべてのデータ(fsd0_0.dat)を出力することはできていますので、おそらく
sprintf(filename, "fsd0_%d.dat", i);
以下が間違っているのだと思います。

*** glibc detected *** ./fs.exe: double free or corruption (top): 0x0000000000c8fa40 ***
======= Backtrace: =========
[0x4096da]
[0x40c4ac]
[0x401e8d]
[0x400700]
[0x40095b]
[0x4003a9]
======= Memory map: ========
00400000-004a7000 r-xp 00000000 fd:02 17700682                           /home/t12301027/test/fs.exe
006a6000-006a8000 rw-p 000a6000 fd:02 17700682                           /home/t12301027/test/fs.exe
006a8000-006e9000 rw-p 00000000 00:00 0
00c8e000-00cb0000 rw-p 00000000 00:00 0                                  [heap]
7f7c6c000000-7f7c6c023000 rw-p 00000000 00:00 0
7f7c6c023000-7f7c70000000 ---p 00000000 00:00 0
7f7c72c42000-7f7c72c44000 rw-p 00000000 00:00 0
7ffdefbc8000-7ffdefbdd000 rw-p 00000000 00:00 0                          [stack]
7ffdefbf8000-7ffdefbf9000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
アボートしました (コアダンプ)

該当のソースコード

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

#define SN 16000
#define MAX 40
#define MIN -40
#define SPN 10 //MAX-MINはSPNで割り切れる

FILE *fr0;
char *read_file="t01d0.dat";

FILE *fw0,*fw[SPN+1];
char *write_file0 = "fsd0_0.dat";
char filename[100];

int total = SN;
int i, j, k, rmin, rmax;
float xf, yf, x[SN+1], y[SN+1], rx[SN+1], ry[SN+1];

void main(){

if(NULL==(fr0=fopen(read_file,"r"))){
printf("filenashi");
exit(EXIT_FAILURE);
}

for (i = 1; i<=SN-1; i++) {

        fscanf(fr0, "%f %f", &xf, &yf);
        x[i] = xf;
        y[i] = yf;
}
for(i = 1; i<=SN-1; i++){
    for(j=i+1;j<=SN;j++){
        rx[i] = x[i];
        ry[i] = y[i];
        if(x[i] >= x[j]){
            rx[i] = x[j];
            ry[i] = y[j];
            x[j] = x[i];
                y[j] = y[i];
            x[i] = rx[i];
            y[i] = ry[i]; 
            }
    }
}
rx[SN] = x[SN];
ry[SN] = y[SN];

fw0 = fopen(write_file0,"a");
for(i=1;i<=SN;i++){
    fprintf(fw0,"%f %f\n",rx[i],ry[i]);
}
fclose(fw0);
for(i=1; i<=SPN; i++){
    sprintf(filename, "fsd0_%d.dat", i);
    fw[i]=fopen(filename, "a");
    rmin = MIN + ((MAX - MIN) / SPN*(i - 1));
    rmax = MIN + ((MAX - MIN) / SPN*i);
    for (k = 1; k <= SN; k++) {
        if (rmin < rx[k] && rx[k] <= rmax) {
            fprintf(fw[i], "%f %f\n", rx[k], ry[k]);
        }
        fclose(fw[i]);
    }

}
fclose(fr0);
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

fclose(fw[i]);


これがkのループにあるので、複数回同じファイルポインタをクローズしています。それが原因です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/24 13:36

    早速の回答ありがとうございました
    修正したところ無事に走りました。

    キャンセル

  • 2017/01/24 14:28 編集

    解決済みにしないと未解決質問として残り続けるのでちゃんとベストアンサーを選んでくださいね

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C++

    3435questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。