我编写了下面的代码来读取包含数组数组的文件,然后添加它们并显示结果。但是,我收到链接中提供的错误消息。是什么原因?
using System;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using System.Xml.Schema;
class ReadFromFile
{
public static void Main()
{
StreamReader rea=new StreamReader(@"c:\users\user\desktop\try.txt");
var lineCount =File.ReadLines(@"c:\users\user\desktop\try.txt").Count();
int count=(int) lineCount;
List<int> ad = new List<int>();
for (int ind = 0; ind < count; ind++)
{
Console.WriteLine(rea.ReadLine());
ad.Add(Int32.Parse(rea.ReadLine()));
}
int[] num = ad.ToArray();
int summ=num.Sum();
rea.Close();
Console.WriteLine(summ);
Console.ReadKey();
}
}
答案 0 :(得分:0)
您的错误来自以下几行:
Console.WriteLine(rea.ReadLine());
ad.Add(Int32.Parse(rea.ReadLine()));
您正在进行的是获取文件中行数的计数。假设您的文件有10行。当循环到达最后一行并在ReadLine
中调用Console.WriteLine(rea.ReadLine());
方法时,它将返回最后一行。但是你再次在Readline
中调用ad.Add(Int32.Parse(rea.ReadLine()));
方法,并且它返回null,因为已经到达文件末尾(EOF)并且Int32.Parse
抛出异常,因为它无法将null转换为数字
这是MSDN关于ReadLine
方法:
输入流的下一行,如果到达输入流的末尾,则为null。
因此,您不仅会获得异常,而且您的总和也将关闭,因为您的ad
列表只包含文件中一半的数字。因此,如果您的文件有10行,则只有5个数字。
<强>修正强>
如果您的文件包含数字并且您确定它们是数字,则可以使用Int32.Parse
。如果您不确定,请使用Int32.TryParse
尝试,如果失败则返回false。如果您只需要总和而不是其他任何东西,您可以在一行代码中执行此操作:
File.ReadLines("PathOfYourFile").Sum(line => int.Parse(line));
如果您不确定该文件可能包含非数字数据,请按以下步骤操作:
File.ReadLines("PathOfYourFile").Sum(line =>
{
int possibleNumber;
if (int.TryParse(line, out possibleNumber)
{
// success so return the number
return possibleNumber;
}
else
{
// Maybe log the line number or throw the exception to
// stop processing the file or
// return a zero and continue processing the file
return 0;
}
}
最后,如果你想按自己的方式去做,请删除这一行,如果你的文件只有数字,那么一切都应该没问题:
// remove this so you do not read the line
Console.WriteLine(rea.ReadLine());
答案 1 :(得分:0)
1)由于使用了Parse方法,因此出现此错误。当编译器无法将输入转换为Int32时,Parse方法会抛出异常。
使用TryParse,如果转换为OK则返回true,否则返回false:
string[] lines = System.IO.File.ReadAllLines(@"c:\try.txt");
int number;
int sum = lines.Sum(line => Int32.TryParse(line, out number) ? number : 0);
Console.WriteLine(sum);
2)当您在循环的一个步骤中调用ReadLine两次时,逻辑错误。因此,您只能在数组中添加偶数行。