簡體   English   中英

C語言,如何將文件中的值轉換為二維數組

[英]C language, How to take values from file into 2d array

我有一個隨機字符的文件,基本上是單詞搜索格式。 我希望能夠將其中的所有字符放入二維拼圖數組中,以便能夠輸入諸如printf(“ value is%c”,puzzle [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]);
}

一旦程序運行,puzzle [x] [y]將不包含任何值。 有任何想法嗎?

update1:​​cols更改為cols = 0 update2:添加了printf(“ \\ n行位於%d,cols位於%d,puzzle [%d,%d] =%c line [cols] =%c”,行,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 

當我運行您的代碼時,我從拼圖數組中的文本文件中獲取了真實的值。 我認為您只是誤解了將這些價值放在何處。 我不確定您在做什么,因為您沒有提供要解析的示例,但是我肯定在我的難題數組中得到了價值。

如果我的文件看起來像這樣:1 2 3 4 5 6 7 8 9 10,那么puzzle [0]的前三個元素為“ 1”,“”,“ 2”,而puzzle的所有其他元素均為空。

玩了一段時間后,我意識到似乎是問題所在。 您已經聲明了cols up top,並且它在循環內被重用。 因此,當行增加時,無需重置cols。 加cols = 0; 在行+和數組之后似乎表現出所需的行為。

編輯:主要是樣式的東西。

一方面,您在while循環中使用了for循環,這對我遍歷多維數組而言似乎很奇怪。 不要誤會我的意思-他們基本上是同一回事。 但是出於可讀性考慮,當您使用行和列執行類似的操作時,通常對while(while)或for(for)進行操作對我來說更有意義。

另外,不要在cols循環的末尾重置cols並增加行數,而是嘗試將其更改為for循環。 如果在for循環的聲明中聲明增量器,則不必擔心會犯這些錯誤,並且IMO更具可讀性。

另外,現在最后要注意的一件事-也許您沒有意識到的是,您必須非常小心在char數組上使用sizeof。 我不會將sizeof用作fgets的maxint,因為sizeof在char數組中包含空終止符(請參閱C ++:使用sizeof的char數組的大小

我不是交流專家,所以這里可能還有很多要說的(從文件中獲取行的方法很多,我不認為fgets是推薦的途徑),但這就是我能想到的全部現在,它有望至少幫助您使其正常運行。

測試

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

暫無
暫無

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

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