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:我的荣幸。我看到您是新手;如果提供了固溶体,请别忘了将答案标记为已接受。欢迎访问!