2011-01-04 6 views
1

私は数字の0〜28,110,000を0のパディングに小さな数字を入れてテキストファイルに書き込もうとしています(信じるかどうか、これは宿題ではありません)。StreamWriterをテキストファイルに使用するC#の問題

Desired Output 
00000001 
00000002 
00000003 
... 
28109999 
28110000 

しかし、私はテキストファイルにこれを書いたときに、出力は次のようになります。途中で停止し、最後の数で

00000001 
    00000002 
    00000003 
    ... 
    27145011 
    27 

。 これがなぜ起こっているのか、どのように修正できるのか誰にでも見てもらえますか?リーダーがクローズまたはフラッシュされていなかったように私ははっきりとあなたのコードはこれを行い参照が

完全なコードは私に

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

私には、あなたのコードがこれをしているのをはっきりと見ても、出力がライターが閉じられていないか、フラッシュされていないように見えます。 – codymanix

+0

コードには読者がいません。これは書き込み操作です。 – MAW74656

+3

Close()ステートメントが実行される前に、ファイルが早すぎますか?例外のトラブルを避けるには、* using *ステートメントを使用します。 –

答えて

0

VS2008でコンパイルして、メモ帳++ 5.7で出力テキストを開きました。すべての28110000ポイントがコンソールと出力ファイルに出力されます。コードは正しいので、問題は他の場所にある必要があります。

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(); 

     } 
    } 
} 

あなたが聞きたいニュースではありませんが、あなたのシステム/セットアップに間違いがあるかどうかを見つけるのに役立ちます。 32ビットコア2デュオ、Windows XP SP3

+0

出力は何ですか?あなたのシステム仕様は私のように聞こえる。 – MAW74656

+0

出力は270 + MBのテキストファイルで、1行に数字が印刷されています。 – Caladain

+0

あなたの出力は、私が欲しい/期待しているものです。 – MAW74656

-2

出力は、見えます。

多分Math.Log10が大きすぎる値に対して間違った値を返します。あなたは固定されたパディングサイズを試しましたか?

例外が発生すると、あなたのアプリでライターが閉じられません。私はあなたのコードを実行して、それは何の問題もなく働いたので、それを使用してください:

using (StreamWriter writer = new StreamWriter(filename, false, Encoding.ASCII)) 
    { 
     // do your stuff here 
    } 
+0

Math.Log10は以前のテストに基づいて正しく動作します。また、それは良い(異なる?)コードかもしれませんが、私のメソッドと同じように両方のコードが正しい場合は使用しないでください? – MAW74656

+0

usingは、例外が発生すると例外が発生し、コードがtry/wrappedにラップされていないため、ストリームが閉じられることを理論的には可能です。 –

+0

@ Aaron-はい、私は理論上の問題を認識していますコードはストリームをはっきりと閉じるので、ここではそれは問題ではありません。 – MAW74656

0

最後の数字はまさに28110000です。私が変更したことの1つは、i%100 == 0のループです。

+0

@ zavaz-それは本当に奇妙です。ループがコメントアウトする唯一の効果は、コンソールの出力が少ない(したがって、操作がはるかに高速です)。右? – MAW74656

+0

私は確認しています。私は現在の価値が何であるかのプリント・ステートメントを追加しました。それは遅くなりますが、私は数分で終了するはずです。 – Caladain

+0

@ MAW74656:はい、あなたのテキストビューアは弱いのでしょうか? – leppie

1

writer.Close()writer.Dispose()に置き換えてみましたか?

私はこの方法で私の同様の問題を解決しました。

+1

- 私は他の手段で解決しましたが、.Dispose()を直接使用せず、(ここでは使用しなかった)ブロックを使用したり、ガベージコレクタにその仕事をさせたりするのはベストプラクティスではありませんか? – MAW74656

+0

@ MAW74656 'using'ブロックは' .Dispose() 'がtry/finallyとして終了したときに例外がスローされた場合に呼び出されることが保証されているので、これを使うのが好ましい方法です。ガベージコレクタは '.Dispose()'を呼び出さないことに注意してください。クラスが( '.Dispose()'を呼び出すはずですが)クラスを定義する場合はfinalizerを呼び出しますが、 'IDisposable'はfinalizerを持つ必要はありません。 –

関連する問題