C语言,如何将文件中的值转换为二维数组



我有一个文件,里面有随机字符,基本上是单词搜索格式。我希望能够将其中的所有字符放入一个2d谜题数组中,这样我就可以键入类似printf的内容("值为%c",谜题[2][2](;它将在第三行和第三列中打印值(因为它从0开始…(,这是我迄今为止的代码。

#define MAXROWS     60
#define MAXCOLS     60
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
main() {
    char TableFileName[100];
    char PuzzleFileName[100];
    char puzzle[MAXROWS][MAXCOLS];
    char line[MAXCOLS];
    FILE *TableFilePtr;
    int cols = 0;
    int rows = 0;
    printf("Please enter the table file name: ");
    scanf("%s",TableFileName);
    /* ... */
    TableFilePtr = fopen(TableFileName, "r");
    while (fgets(line, sizeof line, TableFilePtr) != NULL && rows < MAXROWS) {
        for (cols; cols<(strlen(line)-1) && cols < MAXCOLS; ++cols) {
            puzzle[rows][cols] = line[cols];
        }
        ++rows;
    }
    printf("%c",puzzle[2][2]);
}

一旦程序运行,谜题[x][y]就不包含任何值。有什么想法吗?

update1:已将cols更改为cols=0update2:添加了printf("\n行在%d,列在%d,谜题[%d,%d]=%c行[cols]=%c",行,列,行,谜题[rows,cols],行[cols](;到for循环更新3:在更新2之后,我看到行[cols]字符得到了谜题中的每个字符,但没有按正确的顺序int。此外,这行[cols]并没有被正确地放入谜题[rows][cols]中。以下是我看到的一些内容(不确定为什么它让我把它作为代码,但不管怎样(:

the rows are at 0, cols at 0, puzzle[0,0]=l line[cols]=A
the rows are at 0, cols at 1, puzzle[0,1]=▒ line[cols]=
the rows are at 0, cols at 2, puzzle[0,2]=▒ line[cols]=B
the rows are at 0, cols at 3, puzzle[0,3]=  line[cols]=
the rows are at 0, cols at 4, puzzle[0,4]= line[cols]=D
the rows are at 0, cols at 5, puzzle[0,5]=▒ line[cols]=
the rows are at 0, cols at 6, puzzle[0,6]=▒ line[cols]=E
the rows are at 0, cols at 7, puzzle[0,7]= line[cols]=
the rows are at 0, cols at 8, puzzle[0,8]=L line[cols]=Q
the rows are at 0, cols at 9, puzzle[0,9]=▒ line[cols]=
the rows are at 0, cols at 10, puzzle[0,10]=▒ line[cols]=T

A、B、D、E、A、T是正确的,但是。。。A应该是拼图[0,0],B应该是[0,1]D应该是[0,2]等等…

这是输入的采样器。。。(将在txt文件中(

K N R D J P L H X E K B W M X A M U Y A L E F Q N D L D  
B D B S W W M T F B K Z D G A L V L K U N U R C R I E I  
H N L A N D N T O V P O G R U U Y X E D L Y R M Q D T T  
Y C G Y E M A S I E X P V Z N W H X B D G G R T K V C W  
M Y C X A M I E U T Z J U O C N F F L R E F B T D R Y W  
R K V A C B H G L C F D Y X R Z Q E R E H N Q D S J H T  
R G E N Y Y K F J V G S C G D H O G K A F E M I S S Q P 
S J Z A B V A A P E E P R K F T A H W C G B J N N L W B 
F V F Z Y T V Y E O C Y A D L Q Q P P F V W K M E U V O 

test.c

#define MAXROWS     60
#define MAXCOLS     60
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
main()
{
char TableFileName[100];
char PuzzleFileName[100];
char puzzle[MAXROWS][MAXCOLS];
char line[MAXCOLS];
FILE *TableFilePtr;
int cols;
int rows;
cols=0;
rows=0;
printf("Please enter the table file name: ");
scanf("%s",TableFileName);
TableFilePtr = fopen(TableFileName, "r");
while (fgets(line, sizeof line, TableFilePtr) != NULL && rows < MAXROWS) {
    char *p=line;
    for(cols=0;NULL != (p=strtok(p, " n")) && cols < MAXCOLS; ++cols){
        puzzle[rows][cols]=*p;
        p=NULL;
    }
    ++rows;
}
{   //check puzzle[][] print out
    int r, c;
    for(r=0;r<rows;r++){
        for(c=0;c<cols;c++){
            printf("%c", puzzle[r][c]);
        }
        printf("n");
    }
}
printf("%c",puzzle[2][2]);
}

data.txt

K N R D J P L H X E K B W M X A M U Y A L E F Q N D L D  
B D B S W W M T F B K Z D G A L V L K U N U R C R I E I  
H N L A N D N T O V P O G R U U Y X E D L Y R M Q D T T  
Y C G Y E M A S I E X P V Z N W H X B D G G R T K V C W  
M Y C X A M I E U T Z J U O C N F F L R E F B T D R Y W  
R K V A C B H G L C F D Y X R Z Q E R E H N Q D S J H T  
R G E N Y Y K F J V G S C G D H O G K A F E M I S S Q P 
S J Z A B V A A P E E P R K F T A H W C G B J N N L W B 
F V F Z Y T V Y E O C Y A D L Q Q P P F V W K M E U V O 

执行程序结果:

Please enter the table file name: data.txt
KNRDJPLHXEKBWMXAMUYALEFQNDLD
BDBSWWMTFBKZDGALVLKUNURCRIEI
HNLANDNTOVPOGRUUYXEDLYRMQDTT
YCGYEMASIEXPVZNWHXBDGGRTKVCW
MYCXAMIEUTZJUOCNFFLREFBTDRYW
RKVACBHGLCFDYXRZQEREHNQDSJHT
RGENYYKFJVGSCGDHOGKAFEMISSQP
SJZABVAAPEEPRKFTAHWCGBJNNLWB
FVFZYTVYEOCYADLQQPPFVWKMEUVO
L

当我运行您的代码时,我会从益智数组中的文本文件中获得实际值。我认为你只是误解了你把这些价值观放在哪里。我不能确定你在做什么,因为你没有包含你正在解析的内容的例子,但我肯定在我的谜题数组中得到了值。

如果我的文件如下所示:1 23 45 67 89 10则谜题[0]的前三个元素是"1"、"、"2",并且谜题的所有其他元素都为空。

玩了一会儿之后,我意识到问题出在哪里。您已经在顶部声明了cols,它在循环中被重用。因此,当行增加时,您不会重置列。添加cols=0;在行++之后,数组似乎按照您需要的方式运行。

编辑:主要是风格的东西。

首先,您在while循环中使用了For循环,这对我来说对于在多维数组上迭代似乎很奇怪。别误会我的意思,它们基本上是一样的。但为了可读性,当你对行和列做这样的事情时,对我来说,做while(while(或for(for(通常更有意义。

此外,不要在while循环结束时重置列并增加行,而是尝试将其更改为for循环。如果你在for循环的声明中声明增量,你就不必担心会犯这些错误,它会变得更可读

此外,最后一点需要注意的是,您可能没有意识到在char数组上使用sizeof时必须非常小心。我不会使用sizeof作为fgets的最大值,因为sizeof在char数组中包含null终止符(请参阅本文C++:使用sizeof的char数组的大小(

我不是c专家,所以这里可能还有很多要说的(有很多方法可以从文件中获取行,我不认为fgets是推荐的途径(,但这是我目前所能想到的,希望它至少能帮助你正常运行。

while (fgets(line, sizeof line, TableFilePtr) != NULL && rows < MAXROWS) {
/*
    for (cols=0; cols<(strlen(line)-1) && cols < MAXCOLS; ++cols) {
        puzzle[rows][cols] = line[cols];
    }
*/
    char *p=line;
    for(cols=0;NULL != (p=strtok(p, " n")) && cols < MAXCOLS; ++cols){
        puzzle[rows][cols]=*p;
        p=NULL;
    }
    ++rows;
}

测试打印代码示例:

{   //check puzzle[][] print out
    int r, c;
    for(r=0;r<rows;r++){
        for(c=0;c<cols;c++){
            printf("%c", puzzle[r][c]);//do you mistake like this puzzle[r,c] ?
        }
        printf("n");
    }
}

相关内容

  • 没有找到相关文章