如何在文件为空时终止从文本文件读取
本文关键字:文件 终止 文本 读取 | 更新日期: 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;
...
如果文件为空,它甚至不会进入循环的主体。它也不会在内存中创建整个文件的副本 - 一次只在内存中缓冲一行。