【问题标题】:How to read from a file using C# code?如何使用 C# 代码从文件中读取?
【发布时间】:2013-07-02 19:47:08
【问题描述】:

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

【问题讨论】:

  • 请提供一个简短但完整的程序来说明问题。我们不知道你是否在任何地方初始化了arr
  • 你运行调试器了吗?文件打开了吗?循环是否处理两条线?您的文本格式是否可以转换为双精度格式?
  • 我想在两个textbox中显示数组参数。
  • 该文件包含两个双重参数,如下所示:>35.5>37.5
  • 我创建了文件并在另一个类中保存了 2 个双参数。现在我想在这里使用该参数。不知道我哪里做错了?

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


【解决方案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】:

    试试这个方法

    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&lt;T&gt;(在这种情况下为List&lt;double&gt;)这样的通用集合。

    【讨论】:

      【解决方案3】:

      问题是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();
      

      【讨论】:

        【解决方案4】:

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

            string[] stringDoubles = File.ReadAllLines(path, Encoding.UTF8);
            for(int i=0;i<stringDoubles.Length;i++)        
                arr[i] = Convert.ToDouble(stringDoubles[i]);
        

        【讨论】:

          【解决方案5】:

          您发布的代码将无法编译,因为您尚未初始化数组,并且在 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;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多