2013-08-04 42 views
2

我有這樣的:For循環讀取文件不能正常工作

private void getAccount() 
{ 
    string[] acct = File.ReadAllLines(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\Accts.txt"); 
    for (int i = 0; i < acct[line].Length - 1; i++) 
    { 
     foreach (char c in acct[line]) 
     { 
      if (c.ToString() == ":") 
      { 
       onPass = true; 
       i += 1; 
      } 
      if (onPass == false) { user += acct[line][i]; } 
      if (onPass == true) { pass += acct[line][i]; } 
     } 
    } 
    MessageBox.Show("Username is " + user + ". \n\nPassword is " + pass + "."); 
    onPass = false; 
} 

的文件有這樣的:

minicl55:mypass 

然而,這此輸出:

enter image description here

這些有以下問題:

  • 字符被重複了很多
  • 只有「MMMMMMM」被認爲是用戶名的一部分,一切直到結腸應該是用戶名的一部分,之後通過
  • 的:包括在密碼,應該完全被忽略(除了告訴那裏的用戶名和停止密碼開始)
+0

for循環應該從0開始,直到(line-1),假設行數是文件中的行數。 – thunderbird

+0

你爲什麼不簡單地對它進行所需的線迭代?這裏不需要'for'。哦,在這裏,爲什麼要重複使用字符:除非'foreach'循環結束,否則'i'不會增加,因此會附加相同的字符。 – Leri

+0

使用兩個計數器變量'i和j'...第一個for循環應該遍歷文件的每一行,而第二個foreach循環與計數器j應該遍歷每行的內容。 – thunderbird

回答

5

第一次通過您的for循環時,i == 0。然後foreach循環查看acct[line]中的每個字符,但i永不改變,因此對於:之前的所有字符,acct[line][i]部分總是返回acct[line][0]"m" 8次。這就是爲什麼用戶名似乎是"mmmmmmmm"

然後結腸遇到和i增加1現在onPass == true,所以pass結束有acct[line][1],這是字符"i"。這對字符串的其餘部分重複,所以通過似乎是"iiiiiii"(從冒號到結尾)。

現在我們回到for循環。除i已增加1裏面循環(壞主意)所以現在for循環實際上是i == 2。開始部分再次執行8次(用戶名中每個字符一次),但始終指acct[line][2],因此用戶名是"nnnnnnnn"。除了onPass仍然是真的,所以它被附加到密碼變量。然後在i增加後,您再獲得7個"i"

i變量在內部增大,並在for循環了,所以下一次你使用acct[line][4],這是"c"(8次),然後iforeach循環中增加1,你會得到acct[line][5] 7倍,這是"l"

到目前爲止,密碼是。希望你能看到這個模式。


你可以消除一些循環和複雜性,只是使用類似:(未經測試)

private void getAccount() 
{ 
    var allAccounts = File.ReadAllLines(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\Accts.txt"); 

    foreach (var account in allAccounts) 
    { 
     var pieces = account.Split(':'); 

     MessageBox.Show(string.Format("Username is {0}. \n\nPassword is {1}.", pieces[0], pieces[1])); 
    } 
} 
+1

只要你重寫了整個事情,最好使用'ReadLines'而不是'ReadAllLines',因爲它在讀入時枚舉行而不是將整個文件讀入數組。您還希望將'2'作爲第二個參數傳遞給'Split',以便密碼可以包含':'字符。 – Gabe

+0

很酷,謝謝Gabe ......我不知道那個區別。對於OP,這裏有一些更多信息:[File.ReadLines方法](http://msdn.microsoft.com/en-us/library/dd383503.aspx)(請參閱「備註」部分)。 –

2

你的外循環遍歷每個characct[line]。然後你在內部循環中做同樣的事情,你只是表達一點不同。

0

好了,我看到你的第一個循環獲取特定線,其長度位置不會改變。

for (int i = 0; i < acct[line].Length - 1; i++) 

然後你通過,只有線的每個字符循環

foreach (char c in acct[line]) 

的事情是,如果你的ACCT [線路]有X長度,你會通過ACCT環[線] X倍,爲什麼重複的字符。你最終會讀相同的字符X次。

0

正如其他人都評論/回答,你的外部和內部循環幾乎做着完全相同的事情。我重寫了for循環,以便外循環循環遍歷字符串數組的每一行,然後內循環將遍歷該行中的所有字符。

  for (int line = 0; line < acct.Length; line++) 
      { 
       int i = 0; 
       foreach (char c in acct[line]) 
       { 
        if (c.ToString() == ":") 
        { 
         onPass = true; 
        } 
        else 
        { 
         if (!onPass) 
          user += acct[line][i]; 
         else 
          pass += acct[line][i]; 
        } 
        i++; 
       } 
      } 

然而,我建議,爲自己的利益,如果你通過所有的字符需要循環使用此爲內部循環:

  for (int i = 0; i < acct[line].Length; i++) 
      { 
       if (acct[line][i].ToString() == ":") 
       { 
        onPass = true; 
       } 
       else 
       { 
        if (!onPass) 
         user += acct[line][i]; 
        else 
         pass += acct[line][i]; 
       } 
      } 

或者更好的替代的東西的一切簡單,不容易被微小變化被打破:

 for (int line = 0; line < acct.Length; line++) 
     { 
      if (acct[line].Contains(":")) 
      { 
       string[] parts = acct[line].Split(':'); 
       user = parts[0]; 
       pass = parts[1]; 
       MessageBox.Show("Username is " + user + ". \n\nPassword is " + pass + "."); 
      } 
     } 
1

請出示你的變量,但這裏的另一種方法:

 private void getAccount() 
     { 
      string user = ""; 
      string pass = ""; 
      string[] user_pass = new string[0]; 

      var accts = System.IO.File.ReadAllLines(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\Accts.txt"); 


      foreach(var acct in accts) 
      { 
       user_pass = acct.Split(':'); 
      } 


      //Add iteration for multiple lines 
      if (user_pass.Length > 0) 
      { 
       MessageBox.Show("Username is " + user_pass[0] + ". \n\nPassword is " + user_pass[1] + "."); 
      } 
      else 
      { 
       MessageBox.Show("Chaos: Dogs and Cats Living Together!"); 
      } 

     } 
    } 
}