当我运行我的程序并且我的文本文件中有数据时,它按照我的意图运行。但是,如果文本文件为空,程序将崩溃。因此,我想知道如何解决这个问题。
以下是我从文本文件中读取的代码:
//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为空。
感谢您提供的任何帮助。
答案 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;
...
如果文件为空,它甚至不会进入循环体。它也不会在内存中复制整个文件 - 一次只在内存中缓冲一行。