【问题标题】:C language, How to take values from file into 2d arrayC语言,如何将文件中的值放入二维数组
【发布时间】:2013-03-14 11:41:16
【问题描述】:

我有一个包含随机字符的文件,基本上是单词搜索格式。我希望能够将其中的所有字符放入一个二维拼图数组中,这样我就可以输入类似 printf("the value is %c",puzzle[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]);
}

程序运行后,puzzle[x][y] 不包含任何值。有什么想法吗?

update1:​​将 cols 更改为 for cols=0 update2: added printf("\n行在 %d,cols 在 %d,puzzle[%d,%d]=%c line[cols]=%c",rows,cols,rows,cols,puzzle[rows ,cols],line[cols]);到 for 循环 update3:在更新 2 之后,我看到 line[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 

【问题讨论】:

  • 你使用任何调试器吗?
  • 在该循环中放置一些printf 调用以打印相关变量的值。这应该可以帮助您很快解决它。
  • 尝试调试你的程序,看看哪里出了问题:) gdb 或 Visual Studio。
  • 它得到的结果出错了。我“自我调试”它,拼图[rows][cols]的结果要么是空格、随机数​​、随机字母,要么是▒符号
  • for (cols; ...) 是否应该为每次迭代都使用cols=0

标签: c arrays file multidimensional-array


【解决方案1】:

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

数据.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

【讨论】:

  • 是否有可能使它适用于所有行和列的所有输入?我需要它来处理 20 行和 20 列、40 行和 40 列以及 60 行和 60 列。现在我正在查看我的代码的输出,我看到它采用前 28 个左右的字符并将其放入拼图中,然后将接下来的 28 个字符放入下一行,即使它是第一排。代码的哪一部分声明了何时创建新行?
  • 我也在第 36 行使用此代码来使所有内容更易于查看 printf("\nrows=%d cols=%d puzzle[%d][%d] = %c", r, c,r,c,puzzle[r][c]);
  • 可能到 60*60,因为char puzzle[MAXROWS][MAXCOLS]; MAXROWS 是 60 而 MAXCOLS 是 60
  • 那为什么它会停在拼图[0][28]而不是继续前进?
  • @Alex 第一行数据是“KNRDJPLHXEKBWMXAMUYALEFQNDLD”。 puzzle[0][27] 是第一行数据“D”的最后一个。从拼图[0][28]之后它是一个垃圾。
【解决方案2】:
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");
    }
}

【讨论】:

  • 除了这个绳子的说明外,还需要吗?变化:Sikp Spaces。
  • 尝试使用此代码,不幸的是它给了我相同的确切结果。
  • @Alex 我不会是同样的结果。
  • @Alec 也许,你做了拼图[r,c]。
  • @BLUEPIXY 这应该是其他代码的补充(变量和文件的声明除外还是单独使用?
【解决方案3】:

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

如果我的文件如下所示: 1 2 3 4 5 6 7 8 9 10 那么puzzle[0]的前三个元素是“1”、“”、“2”,而puzzle的所有其他元素都是空的。

玩了一会儿后,我意识到问题所在。您已经在顶部声明了 cols,并且它在循环内被重用。因此,当行增加时,您不会重置 cols。添加 cols = 0;在 rows++ 之后,数组的行为似乎符合您的需要。

编辑:主要是样式。

一方面,您在 while 循环中使用了 for 循环,这对我来说对于迭代多维数组来说似乎很奇怪。不要误会我的意思——它们基本上是一样的。但是为了可读性,当你对行和列执行类似的操作时,我通常使用 while(while) 或 for(for) 更有意义。

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

另外,现在要注意的最后一点 - 也许您没有意识到在 char 数组上使用 sizeof 时必须非常小心。我不会使用 sizeof 作为 fgets 的 maxint,因为 sizeof 在 char 数组中包含空终止符(请参阅这篇文章 C++: size of a char array using sizeof

我不是交流专家,所以这里可能还有很多话要说(有很多方法可以从文件中获取行,我不认为 fgets 是推荐的路线)但我能做到的就这么多现在想想,希望它至少能帮助你让它正常运行。

【讨论】:

  • 我会编辑一些更多的细节和其他一些你应该改变的东西。
  • 是的,我刚刚更改了它,抱歉我之前没有编辑它。检查帖子底部的新更新。取而代之的是,我只是在 for 循环中将其更改为 for cols=0 。应该做同样的事情。感谢您抽出宝贵时间来做这件事!
  • 那是否解决了您的问题?据我所知,这是唯一的问题。否则你将不得不向我展示你的文本文件是什么样的,因为我的文件现在被解析得很好。
  • 我在原始帖子中添加了一个示例输入文件。同样从我所见,有两个问题正在发生。 line[cols] 出于某种原因跳过了每个值的列,其次,puzzle[rows][cols]=line[cols] 无法正常工作。
  • 取决于您跳过列的含义,这可能是因为您使用了 sizeof。请参阅我上面的编辑。听起来第二个问题可能是由第一个问题引起的;)
猜你喜欢
  • 2022-01-01
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2011-06-06
  • 1970-01-01
相关资源
最近更新 更多