2011-01-04 9 views
1

Ich versuche, die Zahlen 0-28,110,000 in eine Textdatei mit Nullen der kleineren Zahlen zu schreiben (ob Sie es glauben oder nicht, das ist KEINE Hausaufgabe).C# -Problem mit StreamWriter zu Textdatei

Desired Output 
00000001 
00000002 
00000003 
... 
28109999 
28110000 

Aber wenn ich diese in eine Textdatei zu schreiben, sieht die Ausgabe wie:

00000001 
    00000002 
    00000003 
    ... 
    27145011 
    27 

Mit der letzten Zahl in der Mitte zu stoppen. Kann jemand sehen, warum das passiert und wie ich es korrigieren kann?

Voll Code

long lastCode = 28110000; 
     int padSize = (lastCode == 0) ? 1 : (int)Math.Log10(lastCode) + 1; 

     String filename = @"C:\Documents and Settings\All Users\Desktop\" + lastCode + "_sequentialCodes.txt"; 
     StreamWriter writer = new StreamWriter(filename, false, Encoding.ASCII); 
     writer.AutoFlush = true; 

     for (int i = 1; i < lastCode + 1; i++) 
     { 
      writer.WriteLine(i.ToString().PadLeft(padSize, '0')); 

      if (i % 100 == 0) 
      { 
       Console.Write("."); 
      } 
     } 

     writer.Close(); 

     Console.WriteLine(); 
     Console.WriteLine(lastCode + " codes written to \n" + filename); 
     Console.Read(); 
+0

Für mich sieht die Ausgabe so aus, als wäre der Schreiber nicht geschlossen oder geleert, obwohl ich deutlich sehe, dass Ihr Code dies tut. – codymanix

+0

Es gibt keinen Leser im Code. Dies ist eine Schreiboperation. – MAW74656

+3

Schaust du die Datei zu früh an, bevor die Close() -Anweisung ausgeführt wird? Verwenden Sie die Anweisung * using *, um Probleme mit Ausnahmen zu vermeiden. –

Antwort

0

Kompiliert mit VS2008, geöffneter Ausgabetext mit Notepad ++ 5.7. Alle 28110000 Punkte wurden in der Konsole und in der Ausgabedatei gedruckt. Ihr Code ist richtig, also muss das Problem woanders liegen.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      long lastCode = 28110000; 
      int padSize = (lastCode == 0) ? 1 : (int)Math.Log10(lastCode) + 1; 

      String filename = @"C:\Documents and Settings\All Users\Desktop\" + lastCode + "_sequentialCodes.txt"; 
      StreamWriter writer = new StreamWriter(filename, false, Encoding.ASCII); 
      writer.AutoFlush = true; 

      for (int i = 1; i < lastCode + 1; i++) 
      { 
       writer.WriteLine(i.ToString().PadLeft(padSize, '0')); 

       if (i % 100 == 0) 
       { 
        Console.WriteLine(i.ToString()); 
       } 
      } 

      writer.Close(); 

      Console.WriteLine(); 
      Console.WriteLine(lastCode + " codes written to \n" + filename); 
      Console.Read(); 

     } 
    } 
} 

Nicht genau die Nachrichten, die Sie hören möchten, aber es sollte Ihnen helfen, zu finden, was mit Ihrem System/Setup falsch ist. 32bit core 2 duo, Windows XP SP3

+0

Was war die Ausgabe? Ihre Systemspezifikationen klingen wie meine. – MAW74656

+0

Ausgabe ist eine 270 + MB Textdatei, mit den Zahlen in einer Zeile gedruckt ein Pop. – Caladain

+0

Ihre Ausgabe ist, was ich will/erwarte. – MAW74656

-2

Für mich sieht die Ausgabe wie der Leser nicht geschlossen oder ausgespült wurde, obwohl ich deutlich Code sieht dies tut.

Vielleicht gibt Math.Log10 einen falschen Wert für zu große Werte zurück. Haben Sie eine feste Padding-Größe versucht?

Wenn eine Ausnahme auftritt, ist der Verfasser in Ihrer App nicht geschlossen. Using die using-Anweisung dafür:

+0

Math.Log10 funktioniert ordnungsgemäß basierend auf früheren Tests. Auch, obwohl es besser sein könnte (anders?) Code, sollte Arbeit nicht die gleiche wie meine Methode, wenn beide richtig codiert sind? – MAW74656

+0

using kümmert sich um das Schließen des zugrunde liegenden Streams sollte eine Ausnahme auftreten und da Ihr Code ist nicht in einem Versuch verpackt/schließlich könnten Sie theoretisch den Stream offen lassen –

+0

@ Aaron-Ja, ich bin mir des theoretischen Problems bewusst, aber die Code schließt den Stream eindeutig, so dass dies kein Problem ist. – MAW74656

0

Seltsam, weil ich gerade Ihren Code ausgeführt habe und es ohne Probleme funktionierte. Die letzte Nummer ist genau 28110000. Eine Sache, die ich geändert habe, war die i% 100 == 0 Schleife zu kommentieren.

+0

@ Zavaz- Das ist wirklich seltsam. Der einzige Effekt, der diese Schleife auskommentiert, ist weniger Konsolenausgabe (und somit viel schnellere Operation). Recht? – MAW74656

+0

Ich überprüfe. Ich habe eine Print-Anweisung hinzugefügt, was meinen aktuellen Wert angeht ... es macht es langsam, aber ich sollte in ein paar Minuten fertig sein. – Caladain

+0

@ MAW74656: Ja, vielleicht ist Ihr Textbetrachter schwach? – leppie

1

Haben Sie versucht, writer.Close() durch writer.Dispose() zu ersetzen?

Ich löste mein ähnliches Problem auf diese Weise.

+1

-Ich habe es mit anderen Mitteln gelöst, aber ist es nicht die beste Vorgehensweise, nicht direkt mit .Dispose() zu arbeiten und stattdessen Blöcke zu verwenden (die ich hier nicht verwendet habe) oder den Garbage Collector arbeiten zu lassen? – MAW74656

+0

@ MAW74656 'using' Blöcke sind der bevorzugte Weg zu gehen, da' .Dispose() 'garantiert aufgerufen wird, wenn eine Ausnahme ausgelöst wird, da sie als try/finally endet. Sie sollten beachten, dass der Garbage Collector '.Dispose()' nicht aufruft. Es wird einen Finalisierer aufrufen, wenn die Klasse einen definiert (der '.Dispose()' aufrufen sollte), aber ein 'IDisposable' muss keinen Finalisierer haben. –