1

我正在做一个项目,我完全被卡住了。我基本上需要从格式如下的文件中读取文本数据:

每行 4 个数字,用逗号分隔(没有多少行的硬性规定,这个程序应该能够处理任意数量的行)

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

基本上我只需要这个文本文档中的 0 元素和第 3 个(最后一个)元素,我需要将它们转换为整数并将它们放入自己的数组中:

所以对于 0 元素我会有一个数组(如果使用上面的文本示例):

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

所以,如果我zeroArray[1]说它会4,如果我thirdArray[0]说它会说7(*这是使用上面的示例数据,它需要能够使用任何数字)

我需要将这些数据转换为int它们自己的数组,以便以后可以对每个元素进行计算。我需要能够调用将执行这些计算的方法(我将编写)。

这是我遇到的问题。

  1. 我无法intArray退出 while 循环,因为它是在 while 循环中声明的,这就是它的范围。但是,如果我尝试声明intArray退出 while 循环,它会给我错误“使用未分配的局部变量” intArray。当我在 while 循环中声明它并尝试在intArraywhile 循环之外使用时,它给了我错误the name intArray does not exist in the current context。所以我的主要问题是我需要能够访问intArray,以便我可以将它用作我的方法的参数来对其执行计算。

  2. 我的第二个问题intArray基本上是保存所有 4 行数据。如果我打印intArray[0],它会打印出所有列出的第一个数字,(使用上面的示例文本)它会打印:

    2 4 33

如果我打印 intArray[3],它会打印出文本数据中的所有第 4 个整数,如下所示:

7
8
65

我假设我需要做的是再制作两个数组,一个保存文本的第一个元素,另一个保存文本的第四个元素,因为这些需要以不同的方式处理。

我试图制作数组来存储这些数据,但无论我尝试什么,它都不起作用。而不是zeroArray[0] = 2,当我打印它时,它给了我整个列表:

2
4
33

如果我再打印zeroArray[1],期待4它再次打印出整个列表

2
4
33

不幸的是,我只能使用循环和一维数组。我不能使用列表、OOP 或二维数组。因此,如果我可以使用列表/二维数组,编码效率就不会那么高。

我目前将值存储到 int 数组intArray中,因为我不确定如何创建一个能够将不同值存储到两个不同数组中的 for 循环。我实在想不出办法。我尝试过的任何方法都失败了。

我可以使用两个数组而不是列表吗?intArray确实保存了转换后的整数值(4个不同的部分,我只需要其中的2个进行计算)。无论如何要创建两个包含intArray[0]intArray[3]值的数组,以便我可以继续对它们进行计算?另外我怎样才能做到这一点,以便我可以在循环外使用这两个数组?如果我在循环外创建一个数组,它不会让我在循环内使用它,如果我在循环内创建一个数组,它不会让我在循环外使用它。

任何帮助将不胜感激

附加的代码是当前正在运行的代码。由于我无法弄清楚如何正确存储这两个数组,因此它们尚未包含在我的代码中

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()方法轻松地从列表中获取数组。编辑:由于您在评论中声明您需要数组,因此针对该用途调整了代码。如果每行有四个数字,则此代码可能对您有用。我警告你,我从不检查连续数字是否少于四个:

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

请注意,您必须定期检查您的阵列的容量是否超出,如果超出,您应该创建具有两倍于先前容量的新实例并将旧实例复制到新实例。此外,当你完成时,count将保存每个数组中的数字数量。

于 2012-11-02T00:01:57.927 回答
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 回答
0

运行一次文件并计算行数。然后你可以声明你的数组并通过第二次运行来读取数据。

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

我能想到的避免两次读取文件的唯一其他选择是手动调整大小zeroArraythirdArray根据需要进行调整,因为您不知道开始时要使它们多大。这就是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

你是linqed吗?会很容易

 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 回答