我有一个包含两行的文件。在哪一行有一个double
参数。
我想从文件中读取两行并将它们保存在双精度数组中。
我使用下面的C#代码,但它不起作用。运行代码后,它不会读取任何内容并且数组为空。
任何人都知道我哪里做错了?
谢谢你的帮助。
private FileStream input;
double[] arr;
int i = 1;
input = new FileStream(Application.StartupPath+"\\City.txt", FileMode.Open, FileAccess.Read);
StreamReader reader = new StreamReader(input);
while (!reader.EndOfStream)
{
arr[i] = Convert.ToDouble(reader.ReadLine());
i++;
}
reader.Close();
答案 0 :(得分:1)
尝试这种方法
using (StreamReader sr = File.OpenText(Application.StartupPath+"\\City.txt"))
{
string line;
// Read and display lines from the file until the end of
// the file is reached.
while ((line = sr.ReadLine()) != null)
{
arr[i] = Convert.ToDouble(line);
i++;
}
}
并且至少应初始化arr
:arr = new double[_size]
和i
应为零,因为c#中的数组基于零。最好使用像List<T>
这样的通用集合(在这种情况下为List<double>
)。
答案 1 :(得分:1)
这是您正在做的事情的完整示例。
string line;
List<double> values = new List<double>();
string path = Path.Combine(Application.StartupPath, "City.txt");
System.IO.StreamReader file = new System.IO.StreamReader(path);
while((line = file.ReadLine()) != null)
{
values.Add(double.Parse(line));
}
file.Close();
答案 2 :(得分:0)
问题是while (!reader.EndOfStream)
,因为当你最初阅读它时,位置是在文件的末尾。由于你没有初始化数组(实际上它甚至不应该编译......),因此行arr[i]
应该失败这一事实会使这一点变得坚固。那么,这个怎么样:
double[] arr = new double[2];
...
reader.BaseStream.Position = 0;
while (!reader.EndOfStream)
{
arr[i] = Convert.ToDouble(reader.ReadLine());
i++;
}
然而,更直接的方法是这样的:
var arr = new List<double>();
var lines = File.ReadAllLines(Application.StartupPath+"\\City.txt");
foreach (var l in lines)
{
arr.Add(Convert.ToDouble(l));
}
return arr.ToArray();
答案 3 :(得分:0)
另一个选择是使用File.ReadAllLines,考虑到文件大小很小。
string[] stringDoubles = File.ReadAllLines(path, Encoding.UTF8);
for(int i=0;i<stringDoubles.Length;i++)
arr[i] = Convert.ToDouble(stringDoubles[i]);
答案 4 :(得分:0)
您发布的代码将无法编译,因为您尚未初始化数组,并且在FileStream上具有可见性修饰符。我猜这个代码来自你项目中的两个不同位置。
但是,有一种更简单的方法:File.ReadAllLines
string path = @"c:\dev\text.txt"; //your path here
string[] lines = File.ReadAllLines(path);
double[] doubles = new double[2];
for (int i = 0; i < doubles.Length; i++)
{
double d;
if (double.TryParse(lines[i], out d))
doubles[i] = d;
}