如何使用C#代码从文件中读取?

时间:2013-07-02 19:47:08

标签: c# file-io text-files filestream

我有一个包含两行的文件。在哪一行有一个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();

5 个答案:

答案 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++;
    }
}

并且至少应初始化arrarr = 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();

基于“How to: Read a Text File One Line At a Time (MSDN)

答案 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;
}
相关问题