2016-08-23 4 views
1

ich eine Anwendung haben, die ein ST-LINK Programme Firmware zu und dann einen Bericht über die Puffergröße hergestellt ist, Datenbits usw.kann nicht in einer Textdatei eine Nummer lokalisieren gefunden C#

ich eine Textdatei welche speichert diese Ergebnisse. Es kann jedoch viele Leiterplatten in einer Charge geben und jedes Mal müssen sie ihre Produktnummer um eins erhöhen. Also, was ich tun möchte, ist das Programm zu bekommen, um den letzten Board-Bericht zu sehen, um zu sehen, ob es die gleiche Chargennummer hat (wie alle Chargen auf einmal gemacht werden), und wenn es die Produktnummer um 1 erhöht hat nicht die gleiche Chargennummer, dann muss es eine neue Charge sein und die Produktnummer ist 1.

Im Moment wird die Produktnummer nicht aktualisiert. Jedes Mal, es ist 1. Hier Rückkehr ist mein Code:

  public int previousNumber() 
    { 
     int pNumber = 0; 
     string line; //set string 
     int counter = 0; //create int 
     int numberOfLines = File.ReadLines("report.txt").Count(); 

     System.IO.StreamReader file = new System.IO.StreamReader("report.txt"); //create streamreader 

     while ((line = file.ReadLine()) != null) //until no empty lines 
     { 
      string[] allLines = File.ReadAllLines("report.txt"); //read in report file 

      if (allLines[numberOfLines - 9] == batchNumberTextBox.Text) 
      { 
       pNumber = int.Parse(allLines[numberOfLines - 7]); 
      } 
      else 
      { 
       pNumber = 0; 

      } 
     } 
     file.Close(); 
     pNumber = pNumber + 1; 
     return pNumber; 
    } 

    private void saveReport() 
    { 
     getValues(); 

      int number = previousNumber(); 
      BatchNumber = batchNumberTextBox.Text; 
      SerialNumber = serialNumberTextBox.Text; 
      ProductNumber = number; 
      string ProductNumberString = ProductNumber.ToString(); 
      string inDate = DateTime.Now.ToString("f", 
        CultureInfo.CreateSpecificCulture("en-UK")); //set date in that format 

      try 
      { 
       board newBoard = new board(BatchNumber, SerialNumber, ProductNumberString, BufferSize, StopBits, Parity, DataBits, baudRate, inDate); 
       newBoard.Save("report.txt"); 
       File.AppendAllText("batches.txt", "BATCH NUMBER: " + BatchNumber + " - DATE: " + inDate + Environment.NewLine); 
       System.Windows.MessageBox.Show("Report Saved"); 
      } 
      catch 
      { 
       System.Windows.MessageBox.Show("Save failed"); //tell user save failed 
      } 

     } 

Und hier ist die Textdatei für die Berichte:

enter image description here

kann man überall sehen, warum kann es nicht funktionieren werden? Ich habe das Gefühl, dass ich etwas merkwürdiger geworden bin, wenn du dir einen besseren Weg vorstellen kannst, wäre es sehr geschätzt!

Vielen Dank im Voraus, Lucy

Antwort

1

Ich nehme an, ist die Chargennummer 1234 in der Datenprobe. Wenn ja, ist es Offset von der letzten Zeile ist -10 und nicht . Dies ist die Hauptquelle für Ihren Fehler.

Es gibt auch eine Menge Redundanz in Ihrem Code: Sie lesen die ganze Datei mehrmals, während Sie es einmal lesen und alle Zeilen in einem Array speichern würde ziemlich genug sein.

Eine vereinfachte (aber immer noch korrekt) Version von previousNumber() wie folgt aussehen:

public int previousNumber() 
{ 
    var allLines = File.ReadAllLines("report.txt"); 
    int pNumber = 0; 
    if (allLines.Length > 10 && allLines[allLines.Length - 10] == batchNumberTextBox.Text) 
     // Note: if the desired value is "1" and not "4096", then the offset is "-8". 
     int.TryParse(allLines[allLines.Length - 8], out pNumber); 
    return pNumber + 1; 
} 
+0

perfekt danke Ihnen sehr! – lucycopp

Verwandte Themen