次のようなファイルについて,すべての行について,
二つ目の空白の次の文字から,そのあとの1行を読み込みたいと思っています.
ファイル名 B00001.dat
8.000000 8.000000 0.092336 0.060463
1016.000000 248.000000 -0.210196 0.098426
8.000000 264.000000 0.050088 0.040239
struct DATA{
char x[50];
};
//構造体型枠宣言
struct DATA a[64][64];
struct DATA b[64][64];
int file_read(char *x){
int n=64,m=0,l=0,i=0; //カウンタ初期化
FILE *fp; //ファイルポインタ
char s[256]; //ファイル読み込みバッファ
fp = fopen(x, "r"); //読み込みモードでファイルオープン
if (fp == NULL) exit(1); //エラートラップ
while (fgets(s,256,fp) != NULL){ //読み込み
m++;
if(m<4)continue;
if(n<0){
l++;
n+=64;
}
strcpy(a[n][l].x,s);
n--;
}
fclose(fp);
return 0;
}
構造体の行列を作成し,それに読み込んだファイルを格納するようにしています.
1行を読み込むところまでは出来ています.
わかる方,教えてください!!
ファイルの読み込み
Re: ファイルの読み込み
takさんがやりたいのは
という行から、「float2 float3 float4」の部分を読み込みたいということですか?
takさんの戦略としては、まず行全体を読み込んで、その後空白文字で分割しようということですか?
現時点でプログラム上まずそうなところを指摘しますと
行を読み込んだ後の文字列の分割にはstrtok関数が使えます。
takさんの戦略としては、まず行全体を読み込んで、その後空白文字で分割しようということですか?
現時点でプログラム上まずそうなところを指摘しますと
- struct DATAのxは長さ50のchar配列だが、ファイルを読み込むときに使っている変数sは長さ256のchar配列である。strcpyしようとすると、配列xの末尾を超えて書き込んでしまう恐れがある。
- nの初期値は64だから、「strcpy(a[n][l].x,s);」の一番最初の実行で、配列外へアクセスしてしまっている。(a[0]~a[63]までしか存在していない)
行を読み込んだ後の文字列の分割にはstrtok関数が使えます。