20x20 グリッドにレイアウトされた数字のファイルがあります (各行に改行があります)。これをプレーンCのintの2次元配列にロードする方法を見つけようとしていますか?
私のファイル I/O の知識は、すでに非常に不安定で、せいぜい幼稚園レベルです。
20x20 グリッドにレイアウトされた数字のファイルがあります (各行に改行があります)。これをプレーンCのintの2次元配列にロードする方法を見つけようとしていますか?
私のファイル I/O の知識は、すでに非常に不安定で、せいぜい幼稚園レベルです。
fscanf バージョン
#include <stdio.h>
int main(void){
FILE *fp;
int i, j;
int data[20][20];
if(NULL==(fp=fopen("data.txt","r"))){
perror("file can't open");
return -1;
}
/* slower than fgets and strtol
for(i=0;i<20;++i)
for(j=0;j<20;++j)
fscanf(fp, "%d", &data[i][j]);
*/
for(i=0;i<20;++i)//little difference
fscanf(fp, "%d %d %d %d %d %d %d %d %d %d"
"%d %d %d %d %d %d %d %d %d %d",
&data[i][0],&data[i][1],&data[i][2],&data[i][3],&data[i][4],
&data[i][5],&data[i][6],&data[i][7],&data[i][8],&data[i][9],
&data[i][10],&data[i][11],&data[i][12],&data[i][13],&data[i][14],
&data[i][15],&data[i][16],&data[i][17],&data[i][18],&data[i][19]);
fclose(fp);
//pickup check
printf("%d\n", data[5][4]);//99
printf("%d\n", data[19][19]);//48
return 0;
}
fgets と strtol のバージョン
#include <stdio.h>
#include <stdlib.h>
int main(void){
FILE *fp;
int i, j, wk;
int data[20][20];
char buff[64], *p, *endp;
if(NULL==(fp=fopen("data.txt","r"))){
perror("file can't open");
return -1;
}
for(i=0;i<20;++i){
fgets(buff, sizeof(buff), fp);
for(j=0, p=buff;j<20;++j, p=endp){
wk = (int)strtol(p, &endp, 10);
if(*endp == ' ' || *endp == '\n' || *endp == '\0'){
data[i][j] = wk;
}
}
}
fclose(fp);
//pickup check
printf("%d\n", data[5][4]);//99
printf("%d\n", data[19][19]);//48
return 0;
}
fscanf または fgets と strtol バージョンを使用しないでください。(おそらく最速ですが、状況は限られています。)
#include <stdio.h>
#include <ctype.h>
int main(void){
FILE *fp;
int data[20][20];
int wk, wk2, *ip, *endp = &data[19][19]+1;
char buff[1280]={0}, *cp;
fp=fopen("data.txt","r");
fread(buff, sizeof(buff), 1, fp);
fclose(fp);
ip=&data[0][0];
wk = 0;
for(cp=buff;ip!=endp;++cp){
if(isdigit(*cp)){
wk2 = wk << 1;
wk = (wk2 << 2) + wk2 + (*cp -'0');
} else {
*ip++ = wk;
wk = 0;
}
}
return 0;
}
注: これら 3 つのバージョンのいずれも、測定不能な状態がごく短時間だけあります。
20×20のデータを読み込む場合、遅いのと早いのでは意味がありません。