2016-01-29 50 views
2

我遇到問題,不能告訴它是什麼。從file.txt讀取其輸入的字符串數組C編程

struct arrayDB { 
char *user[MAX_SIZE]; 
char *pass[MAX_SIZE]; 
char db[10][2]; 
}; 

void readFile(char fileName[100]) 
{ 
    char* word ; 
    char line[90]; 
    FILE *passFile; 
    int rowC=0; 
    int chk=0; 

    passFile=fopen(fileName,"rt"); 
    while(fgets(line,90,passFile)!=NULL) 
    { 
     word=strtok(line," "); 
     rowC=rowC+1; 
     while(word!=NULL) 
     { 
      printf("Count=%i \n",rowC); 
      if(chk==0) 
      { 
       printf("word:%s\n",word); 
       DB.user[rowC]=word; 
       chk=1; 
      } 
      else 
      { 
       printf("word:%s\n",word); 
       DB.pass[rowC]=word; 

      } 
      printf("r=%s , c=%s\n",DB.user[rowC],DB.pass[rowC]); 
      word=strtok(NULL," "); 

     } 

     chk=0; 
    } 
    int i; 

    for(i=1; i<6;i++) 
    { 
     printf("- %s , %s \n",DB.user[i],DB.pass[i]); 
    } 

} 

,但我得到了所有的數組元素的輸出是它是文件 中的最後一個字,你可以在PIC看到

enter image description here

感謝

相同的值
+1

放置截圖而不是文本複製/粘貼真的更容易嗎? –

+1

您顯示的代碼不是您運行該示例的代碼。首先,在行DB.pass [rowC] = word;沒有定義''DB'。 – ryyker

回答

1

您正在將每行讀入相同的字符串line。然後,當您使用strtok()時,它將返回指向此字符串的指針,並將這些指針存儲到DB中。因此,DB中的所有記錄都指向line中的位置,每當您從文件中讀取另一行時,這些位置都會被覆蓋。當一切都完成後,line包含文件最後一行的內容,並且所有DB條目都指向該內容。

另一個問題是line是一個局部變量,當函數返回時指向它的指針變爲無效。

要解決這兩個問題,您需要複製字符串並將其存儲在DB中。例如:

 DB.user[rowC]= strdup(word); 

這也意味着,當你與一個DB記錄完成後,你需要調用free(DB.user[i])

+0

工作像魅力....謝謝你的人 –

1

幾點建議:

首先,學會使用調試器。有free ones,找一本打開它,找到所有這些錯誤的(這就是我在這裏做)

接下來,爲你展現編譯代碼示例,結構定義需要支持你的代碼(目前,DB沒有被定義)

typedef struct 
{ 
    char *user[MAX_SIZE]; 
    char *pass[MAX_SIZE]; 
    char db[10][2]; 
}arrayDB; 

arrayDB DB;//define DB 

接下來,

您需要爲您的字符串數組分配空間: 類似:

for(i=0;i<MAX_SIZE;i++) 
{ 
    DB.user[i] = malloc(100); 
    DB.pass[i] = malloc(100); 
} 

接下來,不要忘記完成使用時釋放它們。

for(i=0;i<MAX_SIZE;i++) 
{ 
    free(DB.user[i]); 
    free(DB.pass[i]); 
} 

接下來,可以使用等於操作者未指定一個字符串:

DB.pass[rowC]=word; 

使用的strcpy(或一些其它字符串函數)代替:

strcpy(DB.pass[rowC],word); 

接着,將該行:

printf("r=%s , c=%s\n",DB.user[rowC],DB.pass[rowC]); 

被調用後con其中要麼要麼DB.user[rowC]DB.pass[rowC]將被寫入,從來都沒有。建議分割此printf語句以打印一個或另一個,並將其放入適當的條件分支中。

+1

謝謝你的所有提示。問題是我是java程序員。但我想用C編寫套接字編程,而且C中的一切都不一樣。再次感謝您。我會盡量做你的建議 –

+1

他*是*遞增指數。你沒看到'rowC = rowC + 1;'? – Barmar

+0

是的。看到最後一條評論之後,我會編輯最後一條評論。謝謝。 – ryyker

相關問題