4

これが私がそれを行う方法です:

static void Main(string[] args)
{
    string FileName = "c:\\error.txt";
    long FilePosition = 137647;

    FileStream fr = new FileStream(FileName, FileMode.Open);
    byte[] b = new byte[1024];
    string data = string.Empty;
    fr.Seek(FilePosition, SeekOrigin.Begin);
    UTF8Encoding encoding = new UTF8Encoding();

    while (fr.Read(b, 0, b.Length) > 0)
    {
        data += encoding.GetString(b);
    }
    fr.Close();
    string[] str = data.Split(new string[] { "\r\n" }, StringSplitOptions.None);
    foreach (string s in str)
    {
        Console.WriteLine(s);
    }
    Console.ReadKey();
}

str 配列は次の行で終了します。

***** ハンド T5-2847880-18 の履歴 (トーナメント: S-976-46079) *****
開始ハンド: 8 月 11 日 (火) 18:14

しかし、ファイルにはさらに行があります。

error.txt を sendspace にアップロードしました: http://www.sendspace.com/file/5vgjtn そして、ここに完全なコンソール出力があります: the_same_site/file/k05x3a

助けてください!私はここで本当に無知です。前もって感謝します!

4

5 に答える 5

16

あなたのコードには、いくつかの微妙なエラーと問題があります:

  • を呼び出してバッファ全体が満たされたと仮定します。GetString(b)
  • 各バッファーは文字の終わりで終了すると想定します。この種の問題を回避するために、 TextReader(eg ) を使用してテキスト データを読み取ります。StreamReader
  • 例外が発生した場合、ファイルを閉じていません (usingディレクティブを使用)
  • ループで文字列連結を使用しています: 優先StringBuilder

他の人が指摘したFile.ReadAllLinesように、この作業の多くを避けるでしょう。File.ReadAllTextファイル以外の場合は 、もありTextReader.ReadToEndます。

最後に、Encoding.UTF8いくつかのオプションを本当に微調整する必要がない限り、新しいインスタンスを作成する代わりに使用してください。

于 2009-08-11T16:52:49.407 に答える
4

技術的にはあなたの質問に対する答えではありませんが、すべてを次のものに置き換えることができます。

string[] str = File.ReadAllLines("c:\\error.txt");

編集 (約束どおり):
ピースを欠落するのではなく、最後の部分の複製があるように思えます。ファイルから完全な 1024 バイトを読み取っているわけではありませんが、1024 バイトすべてを文字列に変換して追加しています。

代わりに、ループは次のようになります。

int bytesRead;
while ((bytesRead = fr.Read(b, 0, b.Length)) > 0)
{
    data += encoding.GetString(b, 0, bytesRead);
}

それ以外:ジョンが言ったこと:)

于 2009-08-11T16:50:56.493 に答える
3

あなたの人生を楽にして、これをしてみませんか?

string[] str = System.IO.File.ReadAllLines("c:\\error.txt");
于 2009-08-11T16:51:53.120 に答える
0

File.ReadLines()を使用する方がはるかに簡単な場合があります。位置を使用する代わりに、気にしない行をスキップします。

int counter = 0;
foreach (string s in File.ReadAllLines(FileName))
{
    ++counter;
    if (counter > 50?)
    {
        Console.WriteLine(s);
    }
}

StreamReaderを使用して、位置を設定した後にストリームをラップしてから、ReadLine()メソッドを使用することもできます。

于 2009-08-11T16:55:07.997 に答える