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

本文关键字:文件 终止 文本 读取 | 更新日期: 2023-09-27 17:55:46

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

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

//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为空。

感谢您提供的任何帮助。

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

稍微

改变一下while循环:

string line;
while ((line = reader.ReadLine()) != null)
{
    string[] fields = line.Split('#');
    ... 
}

如果已到达输入流的末尾,则将null line

更简单的选择可能是使用 Peek() .我稍微修改了 MSDN 的示例StreamReader一点:

string line;
while (reader.Peek() >= 0) 
{
    line = reader.ReadLine();
    ...
}

如果没有要读取的字符(空文件),Peek()将返回-1

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

替换它:

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

有了这个:

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

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

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

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

   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()

你也可以做

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

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

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

会给你一个只有一个元素的字符串数组(空字符串)。

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

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

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

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;
    ...

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