C# 当文件为空时,如何终止从文本文件的读取
当我运行我的程序时,我的文本文件中有数据,它会按照我的预期工作。但是,如果文本文件为空,程序将崩溃。因此,我想知道如何解决这个问题 以下是我从文本文件读取的代码:C# 当文件为空时,如何终止从文本文件的读取,c#,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 FileS
//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];
当它停止时,它表示\u Bean的类型为null
谢谢你能提供的任何帮助 在循环一点的同时更改
:
string line;
while ((line = reader.ReadLine()) != null)
{
string[] fields = line.Split('#');
...
}
如果已到达输入流的末尾,行
将为null
一个更简单的选择可能是使用Peek()
。我稍微修改了一点:
string line;
while (reader.Peek() >= 0)
{
line = reader.ReadLine();
...
}
如果没有要读取的字符(空文件),则Peek()
将返回-1
正如其他人所建议的那样,确保分割字符串数组结果包含计划索引的字段数。如果没有,则可能表明您正在阅读的文件有问题。在循环一点时更改:
string line;
while ((line = reader.ReadLine()) != null)
{
string[] fields = line.Split('#');
...
}
如果已到达输入流的末尾,行
将为null
一个更简单的选择可能是使用Peek()
。我稍微修改了一点:
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('#');
为此:
string[] fields = line.Split(new []{'#'},StringSplitOptions.RemoveEmptyEntries);
您应该在代码中添加字段长度检查,如下所示:
...
string[] fields = line.Split(new[] {'#'}, StringSplitOptions.RemoveEmptyEntries);
if (fields.Length < 4) break;
...
。。。
string[]fields=line.Split(新的[]{'#'},StringSplitOptions.RemoveEmptyEntries);
如果(字段长度<4)中断;
...
您应该在代码中添加字段长度检查,如下所示:
...
string[] fields = line.Split(new[] {'#'}, StringSplitOptions.RemoveEmptyEntries);
if (fields.Length < 4) break;
...
。。。
string[]fields=line.Split(新的[]{'#'},StringSplitOptions.RemoveEmptyEntries);
如果(字段长度<4)中断;
...
您可以检查字段的长度是否正确
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()
您可以检查字段的长度是否正确
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[] lines = System.IO.File.ReadAllLines("File");
foreach (var line in lines)
{
string[] fields = line.Split('#');
}
如果文件为空,则显示以下行
string[] fields = line.Split('#');
将给您一个只有一个元素(空字符串)的字符串数组
这意味着当试图访问第二个元素(字段[1]
)时,代码将引发异常
简而言之:在访问字段数组之前,您应该检查其大小。如果文件为空,则显示以下行
string[] fields = line.Split('#');
将给您一个只有一个元素(空字符串)的字符串数组
这意味着当试图访问第二个元素(字段[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;
...
foreach(File.ReadLines(“i:\\OrderData.txt”)中的字符串行)
{
string[]fields=line.Split(“#”);
if(fields.Length<4)//您可能还需要添加此项。
继续;
...
如果文件为空,它甚至不会进入循环体。它也不会在内存中复制整个文件-内存中一次只缓冲一行。您可以一次枚举一行,而不必像这样缓冲整个内容:
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;
...
foreach(File.ReadLines(“i:\\OrderData.txt”)中的字符串行)
{
string[]fields=line.Split(“#”);
if(fields.Length<4)//您可能还需要添加此项。
继续;
...
如果文件是空的,它甚至不会进入循环体。它也不会在内存中复制整个文件-一次只在内存中缓冲一行。很抱歉延迟发布。这很好,伙计。谢谢你花时间来帮助我。@user3478049:我很高兴。我看到你是新来的,别忘了标记答案如果提供了固溶体,则视为已接受。欢迎访问!抱歉延迟发布。这非常有效,伙计。感谢您抽出时间帮助我。@user3478049:我的荣幸。我看到您是新手;如果提供了固溶体,请别忘了将答案标记为已接受。欢迎访问!