簡體   English   中英

從文本文件讀取數字到2D數組

[英]Read numbers from text file to 2D array

盡管這里有很多例子我似乎無法讓這個工作......

我有一個文本文件,包含許多行,每行有三個(int)值,由一個空格分隔。 例如:

1 0 0
0 0 0
1 0 1
0 0 2
1 0 2

我試圖把它讀成2d數組。

我的代碼到目前為止:

    int main(void)
    {
       char c;
       int i = 0;
       int maxLines = 18;
       char lines[maxLines][BUFSIZ];
       FILE *fp = fopen("inputs/control.txt", "r");

       if (fp == 0)
       {
           fprintf(stderr, "failed to open inputs/control.txt\n");
           exit(1);
       }

       char buffer[maxLines];
       while (i < maxLines && fgets(buffer[i], sizeof(buffer[0]), fp))
       {
          sscanf (buffer, "%d %d %d", &lines[i][0], &lines[i][1], &lines[i][2]);    
          i++;
       }

       fclose(fp);
       return 0;
    }

有人可以提供建議我如何進一步開發這個,以便行中的每個值存儲在一個單獨的數組索引中? 在上面的例子中,我們將存儲類似於:

lines[0][0] = 1
lines[0][1] = 0
lines[0][2] = 0
and so on.....

目前,它將整行存儲在單個數組pos中。

你可能會說我是一個C菜鳥,任何幫助都會很棒!

使用scanf 例:

#include <stdio.h>

int main(int argc, char *argv[]) {
    int i, j;
    int lines[18][3];
    i = 0;
    while (
        i != sizeof(lines) / sizeof(lines[0])
     && 3 == scanf("%i %i %i", lines[i] + 0, lines[i] + 1, lines[i] + 2)
    ) {
        i++;
    }
    for (j = 0; j !=i; j++) {
        printf("%i %i %i\n", lines[j][0], lines[j][1], lines[j][2]);
    }
    return 0;
}

請注意,輸入是從stdin讀取的(使用fscanf以獲得更大的靈活性),這意味着必須將上面的代碼段調用為./a.out < data.txt

你很順利,你只是想到你正在讀一個字符數組而不是一個有符號字符數組(可以改為int等),這是你的例子:

#include <stdio.h>

#define MAXB 32
#define MAXL 18
#define MAXD 3

int main(void)
{
    int i = 0;
    int numlines = 0;
    char buf[MAXB] = {0};
    char lines[MAXL][MAXD];

    FILE *fp = fopen("inputs/control.txt", "r");

    if (fp == 0)
    {
       fprintf(stderr, "failed to open inputs/control.txt\n");
       return 1;
    }

    while (i < MAXL && fgets (buf, MAXB - 1, fp))
    {
        if (sscanf (buf, "%hhd %hhd %hhd", &lines[i][0], &lines[i][1], &lines[i][2]) == 3)
            i++;
    }

    fclose(fp);

    numlines = i;
    int j = 0;

    for (i = 0; i < numlines; i++)
        for (j = 0; j < MAXD; j++)
            printf (" line[%2d][%2d] : %hhd\n", i, j, lines[i][j]);

    printf ("\n");

    return 0;
}

產量

$ ./bin/read_array_a3
 line[ 0][ 0] : 1
 line[ 0][ 1] : 0
 line[ 0][ 2] : 0
 line[ 1][ 0] : 0
 line[ 1][ 1] : 0
 line[ 1][ 2] : 0
 line[ 2][ 0] : 1
 line[ 2][ 1] : 0
 line[ 2][ 2] : 1
 line[ 3][ 0] : 0
 line[ 3][ 1] : 0
 line[ 3][ 2] : 2
 line[ 4][ 0] : 1
 line[ 4][ 1] : 0
 line[ 4][ 2] : 2

注意: char lines[MAXL][MAXD]; 沒關系,您必須明白每個元素都限制為8位有符號值,這意味着-128 < val < 127之間的值。 如果需要存儲更大的值,可以將它們設為int

使用fgets,您正在從文件中讀取整行。 然后,您需要解析此行以提取單個數字並將其存儲到數組中。 在while循環中,您可以讀取緩沖區中的行,然后使用類似strtok / sscanf的內容來解析每個數字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM