数组错误地显示文本文件

时间:2019-04-29 08:49:47

标签: c# arrays

我正在尝试将一个文本文件读入我的数组,但是它将在输出末尾加0,直到数组的大小为止。我认为问题出在我阅读文本文件的方式上。

我使用了一个foreach循环来显示数组,但是它做同样的事情。

static void Main(string[] args)
{
    int size = 10000;
    int[] Array = new int[size];

    StreamReader SR = new StreamReader("Data.Txt");

    int i = 0;           
    while (!SR.EndOfStream)
    {
        Array[i] = int.Parse(SR.ReadLine());
        i++;
    }

    Console.WriteLine("ARRAY BEFORE SORTING" );

    for (int x = 0; x <= Array.Length-1 ; x++)
    {
            Console.WriteLine(Array[x]);
    }

    Console.ReadLine();
}

代码在文本文件中输出常规数字,但之后又添加了不必要的900 0

5 个答案:

答案 0 :(得分:2)

以下是执行此操作的简单方法。 (实现这一目标的方法有很多。您可能会找到不同的答案。我发现您正在使用基本代码块。)

问题

static void Main(string[] args)
    {
        int size = 10000;
        int[] Array = new int[size];

您正在创建一个数组,其中10000个项目分配了0(默认值)。因此,那些未从文本文件中分配值的项目将永远保持0。

解决方案

根据文本文件中的值数创建数组。

string[] lines = File.ReadAllLines(YOUR_FILE PATH);

int[] array = new int[lines.Length];

int i =0; 
foreach(var line in lines)
{
    array[i] = int.Parse(line);
    i++;
}

答案 1 :(得分:0)

您不知道size,对吗?

   static void Main(string[] args)
   {
       // File is non necessary has exactly 10000 items it can have, say, 100 ones
       int size = 10000; 
       int[] Array = new int[size]; 

创建数组时-int[] Array = new int[size];-您已经掌握了-10000个项目,每个项目0;然后 当最后一个9100仍为900时,您重写其中的第一个0

获取正确数组的简便方法是 Linq

   using System.Linq;
   ...

   static void Main(string[] args)
   {
       int[] Array = File
         .ReadLines("Data.Txt")
         .Select(item => int.Parse(item))
         .ToArray();

       Console.WriteLine("ARRAY BEFORE SORTING");
       ...

如果要修改当前代码,请使用List<int>而不是数组来收集项目:

   static void Main(string[] args)
   {
       int size = 10000;
       List<int> items = new List<int>();

       // using: Do not forget to close the file (via IDisposable) 
       using (StreamReader SR = new StreamReader("Data.Txt")) 
       {
           while (!SR.EndOfStream) 
           {
              items.Add(int.Parse(SR.ReadLine()));
           } 
       } 

       // Now either int[] Array = items.ToArray(); or
       int[] Array = new int[items.Count]; // <- no necessary 10000

       for (int i = 0; i < Array.Length; ++i)
          Array[i] = items[i];

       Console.WriteLine("ARRAY BEFORE SORTING");
       ...

答案 2 :(得分:0)

c#中创建任何变量时,它将被初始化为预定义的默认值。

在您的情况下,会将int []分配给{0,0,0,0 .....},这意味着您有一个包含10000个零的数组,但是您将数字设置为某个数字(小于10000),那么您将得到{1,2,3,0,0,0,...}。

如果您之前知道数组长度,则可以更改大小。 或者您是一个List<int>,它是一个动态数组,您可以阅读关于它的所有内容here

这是一个示例用法

           List<int> Array = new List<int>(); // must be intalized otherwise you will get null exception

            using (StreamReader SR = new StreamReader("Data.Txt")) //to prevent memorey leaks
            {

                while (!SR.EndOfStream)
                {  
                    Array.Add(int.Parse(SR.ReadLine()));                     

                } 
            }   

            Console.WriteLine("ARRAY BEFORE SORTING");

            for (int x = 0; x <= Array.Count - 1; x++)
            {
                Console.WriteLine(Array[x]);
            }   

            Console.ReadLine();

答案 3 :(得分:0)

这仅仅是因为您创建了一个大小为'10000'的数组,即使它们为空,foreach也会在数组中的10000个空元素上循环。 如果知道元素的长度,请使用此元素创建数组。否则使用列表。

static void Main(string[] args)
{
    List<int> array = new List<int>();

    StreamReader SR = new StreamReader("Data.Txt");

    while (!SR.EndOfStream)
    {
        array.Add(int.Parse(SR.ReadLine()));
    }
    Console.WriteLine("ARRAY BEFORE SORTING" );

    for (int x = 0; x < array.Count; x++)
    {
        Console.WriteLine(array[x]);
    }

    Console.ReadLine();
}

答案 4 :(得分:0)

您可以改为使用可为空的int数组。这样,默认值为null,并且文本中不会附加任何0。

int size = 10000;
int?[] Array = new int?[size];