1

私はプロジェクトに取り組んでいますが、完全に立ち往生しています。基本的に、次のようにフォーマットされたファイルからテキストデータを読み取る必要があります。

コンマで区切られた 1 行あたり 4 つの数値 (行数の厳密なセットはありません。このプログラムは任意の数の行で動作できるはずです)

2, 32, 4, 7
4, 8, 3, 8
33, 11, 56, 65

基本的に必要なのは、このテキスト ドキュメント内の 0 要素と 3 番目 (最後) の要素だけであり、それらを int に変換して独自の配列に配置する必要があります。

したがって、0 要素の場合は配列になります (上記のテキストの例を使用する場合):

zeroArray[] = 2, 4, 33
thirdArray[] = 7, 8, 65

だから、私が言うzeroArray[1]なら4thirdArray[0]7

int後で各要素を計算できるように、このデータを独自の配列に変換する必要があります。これらの計算を実行するメソッド (これから書く) を呼び出せるようにする必要があります。

これが私が抱えている問題です。

  1. intArraywhile ループ内で宣言されており、それがそのスコープであるため、while ループから抜け出すことはできません。しかし、while ループの out を宣言しようとすると、intArray「割り当てられていないローカル変数の使用」というエラーが表示されますintArray。while ループ内で宣言し、while ループのintArray外で使用しようとすると、エラーが発生しますthe name intArray does not exist in the current context。したがって、私の主な問題はintArray、メソッドが計算を実行するためのパラメーターとして使用できるように、アクセスできる必要があることです。

  2. 私の 2 番目の問題は、intArray基本的に 4 行すべてのデータを保持することです。を印刷intArray[0]すると、リストされている最初の数字がすべて印刷されます (上記のテキスト例を使用)。

    2 4 33

intArray[3] を出力すると、次のようにテキスト データ内の 4 番目の整数がすべて出力されます。

7
8
65

私がする必要があるのは、テキストの最初の要素を保持するための配列と、テキストの 4 番目の要素を保持するための 2 つの配列をさらに 2 つ作成することです。これらは異なる方法で処理する必要があるためです。

このデータを格納する配列を作成しようとしましたが、何を試してもうまくいきません。の代わりにzeroArray[0] = 2、印刷するとリスト全体が表示されます。

2
4
33

次にzeroArray[1]、期待して4印刷すると、リスト全体が再び印刷されます

2
4
33

残念ながら、ループと 1D 配列しか使用できません。リスト、OOP、または 2D 配列を使用できません。したがって、リスト/2D 配列を使用できる場合、コーディングは効率的ではありません。

intArray異なる値を 2 つの異なる配列に格納できる for ループを作成する方法がわからなかったため、現在、値を int 配列に格納しています。私は本当にそうする方法を考えることはできません。私が試みた方法はどれも失敗しました。

List の代わりに 2 つの配列を使用できますか? intArray変換された整数値を保持します (4 つの異なるセクションがあり、計算には 2 つしか必要ありません)。intArray[0]値を保持する 2 つの配列を作成しintArray[3]て、それらを使用して計算を続行できるようにする方法はありますか? また、これらの 2 つの配列をループ外で使用できるようにするにはどうすればよいですか? ループの外側で配列を作成すると、ループ内で使用できなくなり、ループの内側で配列を作成すると、ループの外側で使用できなくなります。

どんな助けでも大歓迎です

添付のコードは現在動作しているものです。2 つの配列を適切に格納する方法がわからないため、コードにはまだ含まれていません。

static void Main(string[] args)
{

    //declarations
    string inputString = "";
    string[] results;
    int holder = 0;

    //import file for reading
    FileStream inFile = new FileStream("input.txt", FileMode.Open, FileAccess.Read);
    StreamReader myStream = new StreamReader(inFile);

    //reads first line
    inputString = myStream.ReadLine();


    while (inputString != null)
    {
        //split the line
        results = inputString.Split(',');
        int[] intArray = new int[results.Length];


        //do whatever processing you need to do to store it


        for (int index = 0; index < results.Length; index++)
        {
            if (int.TryParse(results[index], out holder))
            {
                intArray[index] = holder;
            }//end if
        }//end for

    //reads next line
    inputString = myStream.ReadLine();



    }//end while

    //This is a test to see if the ints are correctly stored
    Console.WriteLine(intArray[0]);  //<--error here stating that 'The name intArray' does not exist in the current context'

}//end main
4

4 に答える 4

2

最も簡単な方法は、配列の代わりに List を使用することです。ファイルの行数がわからないためToArray()、リストのメソッドを使用して、必要に応じてリストから配列を簡単に取得できます。編集:コメントで配列が必要であると述べているため、コードはその用途に合わせて調整されています。各行に 4 つの数字がある場合、このコードはうまくいく可能性があります。連続する数字が 4 つ未満かどうかは決してチェックしないことに注意してください。

static void Main(string[] args) {
        {

            //declarations
        string inputString = "";
        string[] results;
        int holder = 0;
        int []zeroArray = new int[100];
        int []thirdArray = new int[100];

        //import file for reading
        FileStream inFile = new FileStream("input.txt", FileMode.Open, FileAccess.Read);
        StreamReader myStream = new StreamReader(inFile);

        //reads first line
        inputString = myStream.ReadLine();
        int count = 0;
        while (inputString != null)
        {
            //split the line
            results = inputString.Split(new char [] {','},StringSplitOptions.RemoveEmptyEntries);
            if (int.TryParse(results[0].Trim(), out holder))
            {
                zeroArray[count] = holder;
            }
            if (int.TryParse(results[3].Trim(), out holder))
            {
                thirdArray[count] = holder;
            }
            count++;
            if(count == zeroArray.Length)
            {
                int capacity = zeroArray.Length;
                int []oldArray = zeroArray;
                zeroArray = new int[2*capacity];
                oldArray.CopyTo(zeroArray,0);
                oldArray = thirdArray;
                thirdArray = new int[2*capacity];
                oldArray.CopyTo(thirdArray,0);
            }
            //reads next line
            inputString = myStream.ReadLine();
        }//end while


     }//end main

アレイの容量が超過していないことを定期的に確認する必要があることに注意してください。超過している場合は、以前の容量の 2 倍の新しいインスタンスを作成し、古いインスタンスを新しいインスタンスにコピーする必要があります。また、終了countすると、各配列に数字の数が保持されます。

于 2012-11-02T00:01:57.927 に答える
0

ファイルを 1 回実行して、行を数えます。次に、配列を宣言し、もう一度実行してデータを読み取ることができます。

static void Main(string[] args)
{

    //declarations
    string inputString = "";
    string[] results;
    int holder = 0;
    int lines = 0;

    //import file for reading
    FileStream inFile = new FileStream("input.txt", FileMode.Open, FileAccess.Read);
    StreamReader myStream = new StreamReader(inFile);

    //reads first line
    inputString = myStream.ReadLine();

    while(inputString != null){
        lines++;
    }

    int[] zeroArray = new int[lines], thirdArray = new int[lines];

    FileStream inFile = new FileStream("input.txt", FileMode.Open, FileAccess.Read);
    StreamReader myStream = new StreamReader(inFile);

    //reads first line
    inputString = myStream.ReadLine();

    for(int line = 0 ; line < ilnes; line++)
    {
        //split the line
        results = inputString.Split(',');
        zeroArray[line] = int.Parse(results[0]);
        thirdArray[line] = int.Parse(results[3]);

        inputString = myStream.ReadLine();
    }//end for

    //zeroArray and thirdArray should have your info now

}//end main

ファイルを 2 回読み取るのを避けるために私が考えることができる唯一の他のオプションは、手動でサイズzeroArrayを変更しthirdArray、必要に応じてサイズを変更することです。これは、List<int>内部でのようなものがどのように機能するかです。

//need to resize
int[] newArray = new int[oldArray.Length *2];
for(int i=0; i<oldArray.Length; i++){
    newArray[i] = oldArray[i];
}
oldArray = newArray;
于 2012-11-02T00:17:42.390 に答える
0

あなたはリンクされていますか?とても簡単だろう

 var splitted = System.IO.File.ReadAllLines("input.txt")
       .Select(i => i.Split(',')).ToArray();
 var zeroArray = splitted.Select(s => s[0]).ToArray();
 var thirdArray = splitted.Select(s => s[3]).ToArray();
于 2012-11-02T00:34:31.053 に答える
0

これは私が試して完璧に機能したものです。それがあなたを助けることを願っています。幸せな知識の共有

    using (StreamReader sr = new StreamReader(@"C:\Users\Administrator\Documents\test.txt"))
    {
        int[] ZeroArray = null;
        int[] ThirdArray = null;

        int[] ZeroArrayTemp = null;
        int[] ThirdArrayTemp = null;

        int[] tempZero = null;
        int[] tempThird = null;

        int i = 0;

        do
        {
            i++;
            string line = sr.ReadLine();
            string[] values = line.Split(',');

            //get value for ZeroArray
            int valueZero = int.Parse(values[0]);

            //get value for ThirdArray
            int valueThird = int.Parse(values[2]);

            ZeroArrayTemp = new int[i + 1];
            ThirdArrayTemp = new int[i + 1];

            if (tempZero != null)
            {
                for (int j = 0; j < tempZero.Length - 1; j++)
                {
                    ZeroArrayTemp[j] = tempZero[j];
                }
            }

            if (tempThird != null)
            {
                for (int j = 0; j < tempThird.Length - 1; j++)
                {
                    ThirdArrayTemp[j] = tempThird[j];
                }
            }

            ZeroArrayTemp.SetValue(valueZero, i - 1);
            ThirdArrayTemp.SetValue(valueThird, i - 1);

            tempZero = ZeroArrayTemp;
            tempThird = ThirdArrayTemp;

        }while(sr.Peek() != -1);

        //Copy valid value to final array
        ZeroArray = new int[ZeroArrayTemp.Length - 1];
        Array.Copy(ZeroArrayTemp, ZeroArray, ZeroArrayTemp.Length - 1);

        ThirdArray = new int[ThirdArrayTemp.Length - 1];
        Array.Copy(ThirdArrayTemp, ThirdArray, ThirdArrayTemp.Length - 1);

    }
于 2012-11-02T06:59:52.270 に答える