从包含空格的文件加载到2d整数数组

时间:2013-05-03 09:51:17

标签: c arrays file-io multidimensional-array

我有一个数字文件,以20x20网格布局(每行都有换行符)。我试图找出如何将它加载到普通C中的2d数组中?

Here's the grid

enter image description here

Here's a link to the actual text file

我的文件I / O知识已经非常不稳定,幼儿园水平充其量。

1 个答案:

答案 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的数据是没有意义的。