2011-11-23 89 views
3

我需要一些幫助,我想從一個文件打印出來的信息(以字符)讀取數據,並打印出其二維數組內容

我決定用一個二維數組,因爲數據看起來是這樣的

0 0 . . . 
0 0 . . . 
. . . . . 
. . . . . 
. . . . . 

看來我不能打印出來與我準備現在

請參閱下面的代碼:

/* Read from file, pass on file contents to a 2D array, Print file contents from 2D array*/ 

#include<stdio.h> 
#include<string.h> 
#define N 5 


//My proposed function to print an array with contents from a file 
void printboard(int **a, int n, int n); 

int main(int argc, char *argv[]) 
{ 
    char linestr[100]; 
    int board[N][N]; 
    int k; 
    int h=0, l=0; 
    if(argc==2) //File should be called from the terminal hence working with argc & argv 
    { 
     FILE *fp; 
     fp = fopen(argv[1], "r"); 


    if(fp == NULL) 
     { 
      printf("Error, can't open '%s' file!!!\n", argv[1]); 
      return -1; 
     } 
    while (fgets(linestr,sizeof linestr, fp) != NULL) 
     for(k=0; k<strlen(linestr); k++) 
     { 
      if (linestr[k]!='\n') 
      { 
       board[h][l]=(int)linestr[k]; 
       l++; 


      } 
      h++; 
      l=0; 
     } 
     fclose(fp); 
    } 
    printboard(board,h,l); 

return 0; 
} 

void printboard(int **a, int n, int n) 
{ 
    int i, j; 
    for (i=0; i< N; i++) 
    { 
     for (j=0; j< N; j++) 
     { 
      printf("%c", a[i][j]); 
     } 
     printf("\n"); 
    } 


} 

我對C有非常基礎的知識,只在1.5個月前開始編碼。有沒有來自社區的建議,我可以如何解決這個問題或做得更好?其目的是以2D陣列格式打印文件的內容。我真的希望將數據用於二維數組,因爲我需要進一步研究它以在稱爲Peg Solitaire的遊戲中移動「0」。

+1

儘管你有2個具有相同名稱未使用的參數,你printboard方法,你可以對什麼是錯/最新預期的更精確? – DarkSquirrel42

+0

我假設你指的是int n;在打印板功能中出現兩次 – victoria277

+1

這實在太多代碼了。將來,把它歸結爲一個最小的例子。在這個過程中,你可能會發現自己的錯誤。 – dmckee

回答

0

我只是猜測在這裏,當字段爲空時顯示點(。) 所以預先填充您的電路板陣列。

char board[N][N]; // i changed it to char, was int but char is enough 
memset(board, '.', sizeof(board)); 
1

函數中的參數名稱必須是唯一的。所以你的打印板功能不能有兩個「n」參數,你必須改變一個名字(「m」或其他)。另外,既然你打印了n×n個矩陣,並且你已經通過預處理器定義了「N」,你甚至需要這些參數嗎? :)

數組的傳遞(打印板的第一個參數)有點棘手,需要一些關於指針和內存如何工作的知識。看到這裏討論:

http://cboard.cprogramming.com/c-programming/97898-passing-2-dimensional-array-function.html

這是什麼歸結爲是改變你的函數定義:

void printboard(int a[][N], int m, int n); 

一個小東西:爲了打印,你可能想將它們打印爲整數你的號碼而不是字符,所以你應該改變

printf("%c", a[i][j]); 

printf("%d ", a[i][j]); 

我添加了空格,這樣數字在打印到終端時將一起運行。

就解析輸入而言,這是一個完整的強大主題。我建議strtok在你從文件中讀取它們的時候打破你的界限。然後你會使用像sscanf這樣的東西來將數據存儲到你的電路板陣列中。看到這些裁判:

http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/ http://www.cplusplus.com/reference/clibrary/cstring/strtok/

+0

我試驗了沒有兩個參數和N #defined它似乎編譯正確,但現在我似乎打印出來的緩衝區,當我使用「%c」,在函數,現在是void printboard(int a [] [N])和ascii代碼當使用「%d」時,我會檢查你的鏈接,儘管謝謝 – victoria277