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

时间:2013-03-25 03:37:55

标签: c arrays file multidimensional-array

我有一个基本上是单词搜索格式的随机字符文件。我希望能够将其中的所有字符都放入2d拼图数组中,这样我就能输入类似printf的内容(“值为%c”,拼图[2] [2]);并且它将打印第3行和第3列中的值(因为它从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 = 0 UPDATE2:加入的printf( “\ n此行均处于%d,原子%d COLS,益智[%d,%d] =%C线[COLS] =%C”,行,COLS,行,COLS,益智[行,COLS],线[COLS]);为了循环 update3:在更新2之后,我看到行[cols]字符正在获取拼图中的每个字符,但不是正确的顺序。另外,[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 

3 个答案:

答案 0 :(得分:0)

当我运行你的代码时,我从拼图数组中的文本文件中获取实际值。我认为你错误地认为你把这些价值观放在哪里。我不能确定你在做什么,因为你没有包含你正在解析的例子,但我肯定在我的拼图数组中得到了值。

如果我的文件看起来像这样: 1 2 3 4 5 6 7 8 9 10 那么拼图[0]的前三个元素是“1”,“”,“2”,拼图的所有其他元素都是空的。

在玩了一下后,我意识到了什么似乎是问题。你已经将cols声明为top,并且它在循环中被重用。因此,当行增加时,您不会重置cols。添加cols = 0;在行++之后,数组似乎表现得像你需要的那样。

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

首先,你在while循环中使用for循环,对于迭代多维数组而言,这似乎很奇怪。不要误解我 - 他们基本上是一回事。但是为了便于阅读,通常情况下(while)或(for)当你用行和列做这样的事情时,我更有意义。

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

此外,最后一个注意事项 - 也许你没有意识到的事情是你必须非常小心在char数组上使用sizeof。我不会将sizeof用作fgets的maxint,因为sizeof在char数组中包含null终止符(请参阅此帖子C++: size of a char array using sizeof

我不是专家,所以这里可能还有很多内容(有很多方法可以从文件中获取行,我不认为fgets是推荐的路径)但这就是我所能做的一切现在想起来,希望它至少可以帮助你让它正常运行。

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

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");
    }
}