0

c#を使用して.txtファイルを読み、その内容を表示しようとしていますがIndexOutOfRangeException、エラーコードと同様にエラーが発生します0xc000013a

これが私のコードです:

static void Main(string[] args)
    {
        StreamReader sStreamReader = new StreamReader("d:\\TEST.txt");
        while (!sStreamReader.EndOfStream)
        {
            string sLine = "";
            if (sLine != null)
            {
                sLine = sStreamReader.ReadLine();
                if (sLine != null)
                {
                    string[] rows = sLine.Split(",".ToCharArray());
                    double a = Convert.ToDouble(rows[1]);
                    Console.Write(a);
                    int b = Convert.ToInt32(rows[3]);
                    Console.WriteLine(b);
                    Console.WriteLine();
                }
            }
        }
    }

私のテキストファイルは次のとおりです。

1,2,3,4,5,6,7

1,2,3,4,5,6,7

5,6,2,7,3,8,4

3,4,3,4,3

5,3,23,12

12,30000,12,99
4

4 に答える 4

2

私はそれを次のように変更します:

static void Main(string[] args)
    {
        // StreamReader is IDisposable which should be wrapped in a using statement
        using (StreamReader reader = new StreamReader(@"d:\TEST.txt")) 
        {
            while (!reader.EndOfStream)
            {
                string line = reader.ReadLine();
                // make sure we have something to work with
                if (String.IsNullOrEmpty(line)) continue;

                string[] cols = line.Split(',');
                // make sure we have the minimum number of columns to process
                if (cols.Length < 4) continue;

                double a = Convert.ToDouble(cols[1]);
                Console.Write(a);
                int b = Convert.ToInt32(cols[3]);
                Console.WriteLine(b);
                Console.WriteLine();
            }
        }
    }

ここにいくつかのメモ:

  1. StreamReader は IDisposable を実装しているため、適切に破棄されるように using 句でラップする必要があります。
  2. 「sLine」などの名前を付けないでください。その形式のハンガリー語は、深刻な悪い習慣として一般に認識されています。マイクロソフトでさえ、それをしないでくださいと言っています。
  3. 行ではなく列を扱っています。したがって、その変数には適切な名前を付ける必要があります。
  4. やみくもにアクセスする前に、必要なすべての列があることを常にテストして確認してください。
  5. 通常、Convert.ToDouble や Convert.ToInt32 は使用しません。TryParse を使用して、変換できたことを確認する方がはるかに安全です。cols[1] と cols[3] に数値以外のデータがある場合、コードは失敗します。
  6. 文字列の前に @ 記号を使用して、エスケープする必要がないことをコンパイラに伝えることができます。
  7. ループを if ステートメントでラップするのではなく、単純に「続行」する方がはるかにクリーンです。
  8. String 変数を空白の文字列に設定し、すぐに他の値に設定すると、スコープ全体で空白がメモリに残ります。つまり、メモリを浪費しています。確かに、この場合はマイクロ最適化ですが、常にベスト プラクティスを使用しても問題はありません。
于 2012-08-03T06:11:26.567 に答える
1

row.Lengthアクセスする前にrow[1]チェックすることを検討しましたかrow[3]

あなたの空の行が問題だと思います

于 2012-08-03T06:00:32.393 に答える
1

より簡単に行う方法は次のとおりです。

        string[] lines = File.ReadAllLines("d:\\TEST.txt");
        foreach (var line in lines.Where(line => line.Length > 0))
        {
            string[] numbers = line.Split(',');

            // It checks whether numbers.Length is greater than 
            // 3 because if maximum index used is 3 (numbers[3]) 
            // than the array has to contain at least 4 elements
            if (numbers.Length > 3)
            {
                double a = Convert.ToDouble(numbers[1]);
                Console.Write(a);
                int b = Convert.ToInt32(numbers[3]);
                Console.Write(b);
                Console.WriteLine();
            }
        }
于 2012-08-03T06:14:58.180 に答える
0

次の使用を検討する必要があります。

if (!string.IsNullOrEmpty(sLine))

それ以外の

if (sLine != null)

一部の行が空であるため、この例外があります。

ただし、 StreamReader を使用するときにコードを記述する方法は次のとおりです。

using(var reader = new StreamReader(@"d:\\TEST.txt"))
{
    string line;
    while ((line= reader.ReadLine()) != null)
    {
        if (string.IsNullOrEmpty(line)) continue;

        var rows = line.Split(",".ToCharArray());
        var a = Convert.ToDouble(rows[1]);
        Console.Write(a);
        var b = Convert.ToInt32(rows[3]);
        Console.WriteLine(b);
        Console.WriteLine();
    }
}

よろしく、

ケビン

于 2012-08-03T06:08:40.297 に答える