0

我有一个数字文件,以 20x20 的网格布局(每行都有一个换行符)。我试图弄清楚如何将它加载到纯 C 中的二维整数数组中?

这是网格

在此处输入图像描述

这是实际文本文件的链接

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

4

1 回答 1

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的数据的情况下,慢和快是没有意义的。

于 2013-05-03T10:05:36.837 回答