0

20x20 グリッドにレイアウトされた数字のファイルがあります (各行に改行があります)。これをプレーンCのintの2次元配列にロードする方法を見つけようとしていますか?

グリッドはこちら

ここに画像の説明を入力

ここに実際のテキストファイルへのリンクがあります

私のファイル 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;
}

注: これら 3 つのバージョンのいずれも、測定不能な状態がごく短時間だけあります。

20×20のデータを読み込む場合、遅いのと早いのでは意味がありません。

于 2013-05-03T10:05:36.837 に答える