2011-06-23 23 views

Trả lời

41
while(!streamReader.EndOfStream) 
{ 
    string line = streamReader.ReadLine(); 
    Console.WriteLine(line); 
} 
Console.WriteLine("End of File"); 
2

Kiểm tra StreamReader.EndOfStream. Dừng vòng đọc của bạn khi đây là true.

Đảm bảo mã của bạn xử lý chính xác giá trị trả lại cho "số byte vừa đọc" trên số ReadBlock cuộc gọi. Có vẻ như bạn đang thấy không đọc byte và chỉ giả sử rằng nội dung đệm không thay đổi bạn thấy là một lần đọc khác của cùng một dữ liệu.

1

Từ MSDN cho ReadBlock():

Return Value Type: System.Int32 Vị trí của dòng cơ bản là tiên tiến bởi số ký tự được đọc vào bộ đệm. Số các ký tự đã được đọc. Số sẽ nhỏ hơn hoặc bằng số , tùy thuộc vào việc tất cả các đầu vào ký tự đã được đọc chưa.

Vì vậy, tôi sẽ giả định đó là EOF khi nó trả về 0,

2

Khi chiều dài đọc lại nhỏ hơn chiều dài đọc yêu cầu của bạn, bạn đang ở cuối. Bạn cũng nên theo dõi độ dài đọc trong trường hợp kích thước luồng của bạn không phù hợp với kích thước bộ đệm của bạn, vì vậy bạn cần tính đến độ dài của dữ liệu trong bộ đệm ngắn hơn.

do{ 
    len = stream.ReadBlock(buffer, 0, buffer.Length); 
    /* ... */ 
    }while(len == buffer.Length); 

Bạn cũng có thể kiểm tra cờ EndOfStream của luồng trong điều kiện vòng lặp của bạn. Tôi thích phương pháp này vì bạn sẽ không đọc được độ dài '0' (điều kiện hiếm hoi, nhưng nó có thể xảy ra).

do{ 
     len = stream.ReadBlock(buffer, 0, buffer.Length); 
     /* ... */ 
    }while(!stream.EndOfStream); 
2

Đáng tiếc là tôi không thể bình luận về câu trả lời, nhưng câu trả lời của "The Moof" ...

Việc bạn sử dụng cur đây là không đúng, như là tham số index là dành cho chỉ mục trong buffer nơi viết là bắt đầu. Vì vậy, đối với các ví dụ của bạn, nó sẽ được thay thế bằng 0 trong cuộc gọi đến stream.ReadBlock.

Các vấn đề liên quan