2012-05-03 20 views
2

は解決済み:StreamReaderがファイル全体を読み取っていませんか?

は、SDカード上のファイルは、ファイル内のその時点でのNULLの束を持っています。


私はSDカード上のファイルからテキストを読み取るためにNetduino Plusを使用しています。私はC#.NET Micro Framework 4.2とFileReader/StreamReaderを使ってそれを実現しています。私はStreamReaderバッファーが512バイト長であると読んだ。 StreamReaderで512バイトのデータしか読み込めないのですか?私は思ったんだけど、なぜここだと私の問題の説明...

は、ここで私が読んでいるファイルの例です...

40 
3,241,17,17,1000,2000 
3,14,92,223,1000,2000 
3,101,229,12,1000,2000 
3,16,215,228,1000,2000 
3,50,240,11,1000,2000 
3,232,213,10,1000,2000 
3,234,219,219,1000,2000 
3,202,13,222,1000,2000 
3,240,5,65,1000,2000 
3,25,234,3,1000,2000 
3,236,5,164,1000,2000 
3,26,229,12,1000,2000 
3,225,217,18,1000,2000 
3,8,229,216,1000,2000 
3,49,0,7,1000,2000 
3,12,99,190,1000,2000 
3,222,7,226,1000,2000 
3,12,221,208,1000,2000 
3,4,37,227,1000,2000 
3,4,122,48,1000,2000 
3,88,181,192,1000,2000 
3,1,17,222,1000,2000 
3,56,235,19,1000,2000 
3,236,15,101,1000,2000 
3,13,175,231,1000,2000 
3,229,218,17,1000,2000 
3,9,74,239,1000,2000 
3,10,233,17,1000,2000 
3,12,73,227,1000,2000 
3,234,3,3,1000,2000 
3,7,128,110,1000,2000 
3,5,209,241,1000,2000 
3,8,61,229,1000,2000 
3,237,1,238,1000,2000 
3,228,19,19,1000,2000 
3,16,228,92,1000,2000 
3,243,206,14,1000,2000 
3,193,3,220,1000,2000 
3,236,7,7,1000,2000 
3,115,236,7,1000,2000 

-The最初の行には、多くの行がにあるかを示します続く。 - 次の行の最初の数字は、その行から読み取られるデータ項目の数を示します。 (この例では、各行に3つのデータ要素があります) - 行の最後の2つの数値は時間(ミリ秒)です。

私のコードは、このファイルの多くを読み込んで停止します。

40 
3,241,17,17,1000,2000 
3,14,92,223,1000,2000 
3,101,229,12,1000,2000 
3,16,215,228,1000,2000 
3,50,240,11,1000,2000 
3,232,213,10,1000,2000 
3,234,219,219,1000,2000 
3,202,13,222,1000,2000 
3,240,5,65,1000,2000 
3,25,234,3,1000,2000 
3,236,5,164,1000,2000 
3,26,229,12,1000,2000 
3,225,217,18,1000,2000 
3,8,229,216,1000,2000 
3,49,0,7,1000,2000 
3,12,99,190,1000,2000 
3,222,7,226,1000,2000 
3,12,221,208,1000,2000 
3,4,37,227,1000,2000 
3,4,122,48,1000,2000 
3,88,181,192,1000,2000 
3,1,17,222,1000,2000 
3,56,235,19,1000,2000 
3,236,15,101,1000,2000 
3,13,175,231,1000,2000 
3,229,218,17,1000,2000 
3,9,74,239,1000,2000 
3,10,233,17 


other lines are not read 

はこのreadlineの呼び出し上の2つの時間値をミスとlinearryは5つの要素の長さであるので、コードはSystem.IndexOutOfRangeExceptionに以下のコードでTIME2の割り当てに勃発(ヌルがうまく変換されません笑int型へ)とすべての

linearray[0] = "3" 
linearray[1] = "10" 
linearray[2] = "233" 
linearray[3] = "17" 
linearray[4] = "1000" 
linearray[5] = "2000" 

....

linearray[0] = "3" 
linearray[1] = "10" 
linearray[2] = "233" 
linearray[3] = "17" 
linearray[4] = "" 

の代わりに、長い行の残りの部分のような6つの要素であることとのように見える

....のように見えます前の行は正常に読み込まれ、linearrayは必要なすべてのデータを含んでいます。 StreamReaderを正しく使用していませんか?ここでは、コードだ

....

  FileStream fs2 = new FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.None); 
      StreamReader sr = new StreamReader(fs2); 

      line = sr.ReadLine(); 

      numLines = Convert.ToInt32(line); 

      line = ""; 
      for (int i = 0; i < numLines; i++) 
      { 
       line = sr.ReadLine(); 
       string[] linearray = line.Split(comma); 
       numDataElements[i] = int.Parse(linearray[0]); 

       for (int j = 1; j <= numDataElements[i]; j++) 
       { 
        readData[i][j] = byte.Parse(linearray[j]); 
       } 
       //clear the rest of the channels 
       for (int j = (numDataElements[i]+1); j <= MAXCHANNELS; j++) 
       { 
        data[i][j] = (byte)0; 
       } 

       time1[i] = Convert.ToInt32(linearray[linearray.Length - 2]); 
       time2[i] = Convert.ToInt32(linearray[linearray.Length - 1]); 

      } 

ありがとう!

+0

'line = sr.ReadLine();'の呼び出しはnullを返しますか?ストリームの終わりに達すると、null値が返されるはずです。また、StreamReaderが終了したら、必ずそれを処分してください( 'using'キーワードはあなたの友人です)。 –

+1

ReadLineの代わりにReadToEndを試して、一度にファイル全体を読み込んで、異なる結果が得られたかどうかを確認することができます。 – mbeckish

+0

まず、ファイルをチェックするか、クリーンなファイルを作成してテストします。私は "17"の後にいくつかの目に見えない制御文字を疑う。 –

答えて

0

この質問に答えるだけで、上記のコードに問題はありませんでした。 FTPサーバーライブラリにバグが見つかりました。また、512バイトのバッファを使用していただけで、そのバッファを書き込むのはFULLでした。部分的にいっぱいだった2番目のバッファが入ってくるファイルに書き出されることはありませんでした。私はFTPライブラリのコードを修正し、すべてが良いです!

関連する問題