- ベストアンサー
データファイルの内容を部分的に書き換える方法
現在,三角形要素を用いた有限要素法による磁場解析を行っています. 最初に,読み込むインプットデータとして以下のような形式のファイルがあります. 要素番号 節点番号1 節点番号2 節点番号3 材料番号 1 18 16 11 0 2 18 31 16 0 . . . 541 332 321 318 1 ←例ではこの1を0に書き換える 542 331 333 321 1 . . . このような外部データファイルのうち指定した要素番号の行の材料番号を 書き換えるようなプログラムを作りたいのですが, (例:要素番号541の行の材料番号1を0に書き換える) 具体的にどのような関数を用いて,どのようなコードを記述すればいいかお教え願えないでしょうか.大まかには 1)指定の要素番号を検索する 2)その行の材料番号を書き換える という操作をしてやればいいと思うのですが・・.
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
思いつきで作ったため、雑なプログラムです>< ----------main.cpp---------- #include <stdio.h> #include <stdlib.h> #define DATA_MAX 256 void main() { FILE *fp_in, *fp_out; char dammy[256]; int no, data, n, a, b, c, d, e; if((fp_in = fopen("data.txt","r")) == NULL) { exit(EXIT_FAILURE); } fp_out = fopen("data2.txt","w"); printf("No."); scanf("%d", &no); printf("\n"); printf("Data"); scanf("%d", &data); printf("\n"); fscanf(fp_in, "%s", dammy); fprintf(fp_out, "要素番号,節点番号1,節点番号2,節点番号3,材料番号\n"); while(n = fscanf(fp_in, "%d,%d,%d,%d,%d", &a, &b, &c, &d, &e) != EOF) { if(n == 1) { if(a == no) { e = data; } fprintf(fp_out, "%d,%d,%d,%d,%d\n", a, b, c, d, e); } else { fgetc(fp_in); } } fclose(fp_in); fclose(fp_out); } 読み取りデータ(data.txt) 要素番号,節点番号1,節点番号2,節点番号3,材料番号 1,18,16,11,0 2,18,31,16,0 3,19,30,15,0 4,20,29,14,0 5,21,28,13,0 6,22,27,12,0 7,23,26,11,0 実行結果 入力値 No 6 Data 2 出力データ(data2.txt) 要素番号,節点番号1,節点番号2,節点番号3,材料番号 1,18,16,11,0 2,18,31,16,0 3,19,30,15,0 4,20,29,14,0 5,21,28,13,0 6,22,27,12,2 <--- ここが変わってます 7,23,26,11,0 意図が違ってたらごめんなさい。 参考になれば幸いです。
その他の回答 (1)
- ymmasayan
- ベストアンサー率30% (2593/8599)
外部データファイルの作り方によりますが 一般的な要素番号ごとに1レコードにする方式では 1.特定の要素レコードをワークエリア(構造体)に読み込む 2.特定の箇所を書き換える 3.レコードを元の場所に書き戻す と言うのが普通です。
お礼
早速の回答ありがとうございます! 構造体を用いたデータ処理は今後プログラムを拡張していく上で必要になってきそうです. その際にはお教えいただいた手法を用いて処理できるようにがんばってプログラミングしようと思います! 回答ありがとうございました!
お礼
丁寧に回答していただき本当にありがとうございます! fscanf関数とwhile,if文を用いればこのように1行ずつ処理できるのですね. 非常に参考になりました! ありがとうございます! 早速このコードを参考に自分のプログラムに組み込んでみようと思います!