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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C++

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

Q&A

解決済

1回答

2890閲覧

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

Poi_Poi

総合スコア12

C++

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

0グッド

0クリップ

投稿2017/01/24 04:16

###前提・実現したいこと
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] アボートしました (コアダンプ)

###該当のソースコード

C++

1#include <stdio.h> 2#include <stdlib.h> 3 4#define SN 16000 5#define MAX 40 6#define MIN -40 7#define SPN 10 //MAX-MINはSPNで割り切れる 8 9FILE *fr0; 10char *read_file="t01d0.dat"; 11 12FILE *fw0,*fw[SPN+1]; 13char *write_file0 = "fsd0_0.dat"; 14char filename[100]; 15 16int total = SN; 17int i, j, k, rmin, rmax; 18float xf, yf, x[SN+1], y[SN+1], rx[SN+1], ry[SN+1]; 19 20void main(){ 21 22if(NULL==(fr0=fopen(read_file,"r"))){ 23printf("filenashi"); 24exit(EXIT_FAILURE); 25} 26 27for (i = 1; i<=SN-1; i++) { 28 29 fscanf(fr0, "%f %f", &xf, &yf); 30 x[i] = xf; 31 y[i] = yf; 32} 33for(i = 1; i<=SN-1; i++){ 34 for(j=i+1;j<=SN;j++){ 35 rx[i] = x[i]; 36 ry[i] = y[i]; 37 if(x[i] >= x[j]){ 38 rx[i] = x[j]; 39 ry[i] = y[j]; 40 x[j] = x[i]; 41 y[j] = y[i]; 42 x[i] = rx[i]; 43 y[i] = ry[i]; 44 } 45 } 46} 47rx[SN] = x[SN]; 48ry[SN] = y[SN]; 49 50fw0 = fopen(write_file0,"a"); 51for(i=1;i<=SN;i++){ 52 fprintf(fw0,"%f %f\n",rx[i],ry[i]); 53} 54fclose(fw0); 55for(i=1; i<=SPN; i++){ 56 sprintf(filename, "fsd0_%d.dat", i); 57 fw[i]=fopen(filename, "a"); 58 rmin = MIN + ((MAX - MIN) / SPN*(i - 1)); 59 rmax = MIN + ((MAX - MIN) / SPN*i); 60 for (k = 1; k <= SN; k++) { 61 if (rmin < rx[k] && rx[k] <= rmax) { 62 fprintf(fw[i], "%f %f\n", rx[k], ry[k]); 63 } 64 fclose(fw[i]); 65 } 66 67} 68fclose(fr0); 69}

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

C++

1fclose(fw[i]);

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

投稿2017/01/24 04:27

masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Poi_Poi

2017/01/24 04:36

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

2017/01/24 05:29 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問