ここから本文です

回答受付中の質問

知恵コレに追加する

C言語のテキストファイルの読み込みに関して教えていただきたいです。

hysunk7101さん

C言語のテキストファイルの読み込みに関して教えていただきたいです。

C言語に関する質問なのですが、テキストファイルにx,y,z座

0.5 1.0 0.5
1.0 0.5 1.0
2.0 1.5 1.0
・・・・

が入っているのですが、これをx[i],y[i],zi[i]の配列に読み込むのにはどうのようにすればよいのでしょうか。
(x[0]=0.5,y[0]=1.0,z[0]=0.5,x[1]=1.0,y[2]=0.5,z[2]=1.0・・・のように読み込められるよう
したいです。)
おそらくfscanfを使うのだと思うのですが、今の手持ちの教科書だけではよく理解できませんでした。

もしよろしければどなたか教えていただけないでしょうか。
よろしくお願いいたします。

  • アバター

違反報告

この質問に回答する

回答

2件中12件)
並べ替え:回答日時の
新しい順
古い順

 

magurogetさん

入力形式のチェックをしないのであれば、fgets() などをかませるのは無駄ですから、単に scanf() をそのまま使うほうがシンプルだし効率もいいでしょう。

たとえば、
===
#include <stdio.h>

int main(void)
{
enum { N = 30 };
static double x[N], y[N], z[N];
int n = 0, i;

while (scanf("%lf%lf%lf", x + n, y + n, z + n) == 3) if (++n >= N) break;

for (i = 0; i < n; ++i) printf("%g\t%g\t%g\n", x[i], y[i], z[i]);

return 0;
}
===
$ ./a.exe <input.txt
0.5 1.0 0.5
1.0 0.5 1.0
2.0 1.5 1.0

===
とか。一次元配列を 3 つ使うより、二次元配列を 1 つ使うほうがいい感じはしますけどね。

また、サイズの明示的な上限を設けたくなければ、静的な領域ではなく、realloc() などで動的なメモリを使えばいいでしょう。

  • アバター

rhinosugarさん

/*
fgets,_sscanf_を用いた標準的な配列入力方法です
sscanfの返り値をチェックするともっといいのですが
簡単な入力ではこのように省きます。
ファイルオープンのエラーは入力ファイルが
実行ファイルと同じホルダにないとき起こります
その対応は「ファイル・パス名」を使用します。
fgets==NULLはファイル終了時におきます、しかし
読み込みエラーでも起きることになっています。
めったにありませんが
入力値の文字列→数値変換についてはもっと丁寧な
strtod関数があります。出来ればそっちがお勧めです。
*/
#include_<stdio.h>

#define___MBFF____256___//_文字バッファ寸法
#define___N_______1000__//_配列の寸法

int_main(){
__char__*fname="test.txt";__//_テキストファイル名
__FILE__*fp;__________//_同上のファイルポインター
__char__buff[MBFF];___//_入力1行の文字バッファ
__double__x[N],y[N],z[N];___//_入力先配列
__int___k,j;

__//_ファイルオープン
__if((fp=fopen(fname,"r"))==NULL)_{
____printf("%s_が開けません\n",fname);_return_1;
__}
__//_ファイル入
__k_=_0;
__while(fgets(buff,MBFF,fp)!=NULL)_{
____if(k==N)_{
______printf("列寸法[%d]が足りません\n",N);
______return_2;
____}
____sscanf(buff,"%lf%lf%lf",&x[k],&y[k],&z[k]);
____k++;
__}
__printf("%s_(%d行)読み込み終了\n",fname,k);
__//_確認出力
__printf("確認:\n");
__for(j=0;j<k;j++)_{
____printf("%4d_%9f_%9f_%9f\n",j,x[j],y[j],z[j]);
__}
__printf("終了:\n");
__return_0;
}
/*_出力:
test.txt_(3行)読み込み終了
確認:
___0__0.500000__1.000000__0.500000
___1__1.000000__0.500000__1.000000
___2__2.000000__1.500000__1.000000
終了:
*/
/*_入力:test.txt
0.5_1.0_0.5
1.0_0.5_1.0
2.0_1.5_1.0
*/

  • アバター

この質問に回答する

話題のキーワード

[カテゴリ:C言語関連]