2014-04-01 42 views
2

當我運行我的程序並且在我的文本文件中有數據時,它按照我的意圖工作。但是,如果文本文件爲空,程序將崩潰。因此,我想知道如何解決這個問題。如何在文件爲空時從文本文件中終止讀取

這是我從文本文件中讀取代碼:

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

感謝您提供任何幫助。

回答

4

更改while循環了一下:

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

linenull如果輸入流的末尾已到達。

更簡單的選項可能是使用Peek()。我修改了MSDN's example for StreamReader一點點:

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

Peek()將返回-1如果沒有要讀取(空文件)字符。

正如其他人所建議的,確保您的拆分字符串數組結果具有您計劃編制索引的字段數。如果沒有,它可能表明您正在閱讀的文件存在問題。

+0

對不起,發佈時間延遲。這完美搭配。感謝您花時間幫助我。 – user3478049

+0

@ user3478049:我的榮幸。我看到你是新的;如果它提供了一個可靠的解決方案,請不要忘記將答案標記爲已接受。歡迎來到[so]! –

0

替換此:

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

這一點:

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

您應該添加檢查你的代碼字段的長度,這樣的:

 ... 
     string[] fields = line.Split(new[] {'#'}, StringSplitOptions.RemoveEmptyEntries); 
     if (fields.Length < 4) break; 
     ... 
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() 
0

你也可以做

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

如果文件是空的,那麼下面一行

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

會給你只有一個元素(空字符串)的字符串數組。

這意味着當試圖訪問第二個元素(fields[1])時,您的代碼將引發異常。

小故事:你應該在訪問它之前檢查字段數組的大小。

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; 

    ... 

如果該文件是空的,它甚至不會進入循環體。它也不會在內存中創建整個文件的副本 - 只有一行會一次緩存在內存中。

相關問題