2011-09-07 56 views
0

我有一個計時器,每秒循環下面的代碼。這段代碼依次讀取幾個xml片段,然後將它們打印到屏幕上,然後在一秒鐘後重復此操作。輸出:如何向字符串寫入值然後返回?

34, 
23, 
12, 

我想要做的就是讓所有數據都寫入到一個字符串像34,23,12然後返回它,以便另一個類可以使用它。但是,如果我在if (fragmentReader.Read())代碼下面輸入它(字符串代碼,你會在下面看到它),它不起作用,因爲它只是做與上面的console.writeline相同的事情:讀取一個片段然後寫入控制檯,然後是下一個片段,它不會將片段中的所有值添加到一個字符串中。

感謝

private static void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     using (var file = MemoryMappedFile.OpenExisting("AIDA64_SensorValues")) 
     { 
      using (var readerz = file.CreateViewAccessor(0, 0)) 
      { 
       var bytes = new byte[195]; 
       var encoding = Encoding.ASCII; 
       readerz.ReadArray<byte>(0, bytes, 0, bytes.Length); 

       //File.WriteAllText("C:\\myFile.txt", encoding.GetString(bytes)); 

       StringReader stringz = new StringReader(encoding.GetString(bytes)); 

       var readerSettings = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment }; 
       using (var reader = XmlReader.Create(stringz, readerSettings)) 
       { 
        while (reader.Read()) 
        { 
         using (var fragmentReader = reader.ReadSubtree()) 
         { 
          if (fragmentReader.Read()) 
          { 
           reader.ReadToFollowing("value"); 
           //Console.WriteLine(reader.ReadElementContentAsString() + ","); 

           System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
           sb.Append(reader.ReadElementContentAsString()).Append(","); 
           Console.WriteLine(sb.ToString()); 
          } 
         } 
        } 
       }     
      } 
     } 
    } 

回答

5

問題是,在循環的每次迭代中,您都會創建一個新的stringbuilder對象。您需要在循環之前創建該對象,然後在循環之後打印該字符串。

你想要什麼:

    System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
       while (reader.Read()) 
        { 
         using (var fragmentReader = reader.ReadSubtree()) 
         { 
          if (fragmentReader.Read()) 
          { 
           reader.ReadToFollowing("value"); 
           //Console.WriteLine(reader.ReadElementContentAsString() + ","); 


           sb.Append(reader.ReadElementContentAsString()).Append(","); 
          } 
         } 
        } 
        Console.WriteLine(sb.ToString()); 
1

它看起來像你的StringBuilderSB是走出去的範圍。嘗試移動它,以便在您進入日常工作後立即創建它。並且添加@Stephan H表示在退出循環之後需要放置WriteLine,以便獲得正確的輸出。

static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
    using (var file = MemoryMappedFile.OpenExisting("AIDA64_SensorValues")) 
    { .... 
+1

隨着將Writeline留在循環中,輸出將是34,34,23,34,23,12,這不是預期的輸出。 –

+1

你是對的我沒有注意到它 –

1

嘗試將while循環外的StringBuilderWriteLine電話。由於您正在爲循環的每次迭代創建一個新的StringBuilder,因此您將得到只有1個值(剛讀取的值)的字符串。

using (var reader = XmlReader.Create(stringz, readerSettings)) 
{ 
    System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
    while (reader.Read()) 
    { 
     using (var fragmentReader = reader.ReadSubtree()) 
     { 
      if (fragmentReader.Read()) 
      { 
       reader.ReadToFollowing("value"); 
       sb.Append(reader.ReadElementContentAsString()).Append(","); 
      } 
     } 
    } 
    Console.WriteLine(sb.ToString()); 
}   
相關問題