如何在文件为空时终止从文本文件中读取

时间:2014-04-01 15:03:45

标签: c#

当我运行我的程序并且我的文本文件中有数据时,它按照我的意图运行。但是,如果文本文件为空,程序将崩溃。因此,我想知道如何解决这个问题。

以下是我从文本文件中读取的代码:

//This method reads the order data from a text file and assigns the values to each object's variables
    void Read_Order_Data()
    {
        FileStream fs = new FileStream("i:\\OrderData.txt", FileMode.Open, FileAccess.Read);
        StreamReader reader = new StreamReader(fs);

        while (!reader.EndOfStream)
        {
            string line = reader.ReadLine();
            string[] fields = line.Split('#');
            Order[Number_Of_Orders].Order_Number = fields[0];
            Order[Number_Of_Orders].Type_Of_Bean = fields[1];
            Order[Number_Of_Orders].Quantity_Of_Order = fields[2];
            Order[Number_Of_Orders].Date_Of_Purchase = fields[3];
            Number_Of_Orders++;
        }//end of while statement
        reader.Close();
    }//end of Read_Order_Data()

如果文本文件为空,我的程序将在此行停止:

Order[Number_Of_Orders].Type_Of_Bean = fields[1];

当它停止时,它说Type_Of_Bean为空。

感谢您提供的任何帮助。

7 个答案:

答案 0 :(得分:4)

稍微更改while循环:

string line;
while ((line = reader.ReadLine()) != null)
{
    string[] fields = line.Split('#');
    ... 
}
如果已到达输入流的末尾,

line将为null

更简单的选项可能是使用Peek()。我稍微修改了MSDN's example for StreamReader

string line;
while (reader.Peek() >= 0) 
{
    line = reader.ReadLine();
    ...
}
如果没有要读取的字符(空文件),

Peek()将返回-1

正如其他人所建议的那样,请确保您的拆分字符串数组结果具有您计划编制索引的字段数。如果它没有,则可能表示您正在阅读的文件存在问题。

答案 1 :(得分:0)

替换它:

string[] fields = line.Split('#');

有了这个:

string[] fields = line.Split(new []{'#'},StringSplitOptions.RemoveEmptyEntries);

答案 2 :(得分:0)

您应该在代码中添加对字段长度的检查,如下所示:

        ...
        string[] fields = line.Split(new[] {'#'}, StringSplitOptions.RemoveEmptyEntries);
        if (fields.Length < 4) break;
        ...

答案 3 :(得分:0)

您可以检查字段是否具有正确的长度

   void Read_Order_Data()
    {
       FileStream fs = new FileStream("i:\\OrderData.txt", FileMode.Open, FileAccess.Read);
       StreamReader reader = new StreamReader(fs);

    while (!reader.EndOfStream)
    {
        string line = reader.ReadLine();
        string[] fields = line.Split('#');
        if (fields.length == 4){
           Order[Number_Of_Orders].Order_Number = fields[0];
           Order[Number_Of_Orders].Type_Of_Bean = fields[1];
           Order[Number_Of_Orders].Quantity_Of_Order = fields[2];
           Order[Number_Of_Orders].Date_Of_Purchase = fields[3];
           Number_Of_Orders++;
        }
    }//end of while statement
    reader.Close();
}//end of Read_Order_Data()

答案 4 :(得分:0)

您也可以

string[] lines = System.IO.File.ReadAllLines("File");
foreach (var line in lines)
{
     string[] fields = line.Split('#');
}

答案 5 :(得分:0)

如果您的文件为空,则以下行

string[] fields = line.Split('#');

将为您提供一个只包含一个元素的字符串数组(空字符串)。

这意味着在尝试访问第二个元素(fields[1])时,您的代码将引发异常。

简短的故事:你应该在访问之前检查字段数组的大小。

答案 6 :(得分:0)

您可以一次枚举一行,而不必像以下那样缓冲整个内容:

foreach (string line in File.ReadLines("i:\\OrderData.txt"))
{
    string[] fields = line.Split('#');

    if (fields.Length < 4) // You might also need to add this.
        continue;

    ...

如果文件为空,它甚至不会进入循环体。它也不会在内存中复制整个文件 - 一次只在内存中缓冲一行。