我有一个数字文件,以20x20网格布局(每行都有换行符)。我试图找出如何将它加载到普通C中的2d数组中?
Here's a link to the actual text file
我的文件I / O知识已经非常不稳定,幼儿园水平充其量。
答案 0 :(得分:2)
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;
}
注意:这三个版本中的每一个版本都只能在非常短的时间内无法衡量。
对于缓慢而快速的情况,读取20 x 20的数据是没有意义的。