2

我有一个文件包含两行。并且在哪一行有一个double参数。我想从文件中读取两行并将它们保存在 doubles 数组中。我使用了下面的 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();
4

5 回答 5

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>在这种情况下)。

于 2013-07-02T19:52:51.147 回答
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();

基于“如何:一次读取一行文本文件 (MSDN)

于 2013-07-02T19:54:13.283 回答
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();
于 2013-07-02T19:51:44.237 回答
0

另一个选择是使用File.ReadAllLines,考虑到文件很小。

    string[] stringDoubles = File.ReadAllLines(path, Encoding.UTF8);
    for(int i=0;i<stringDoubles.Length;i++)        
        arr[i] = Convert.ToDouble(stringDoubles[i]);
于 2013-07-02T19:53:24.960 回答
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;
}
于 2013-07-02T19:54:11.980 回答