2012-02-10 23 views
9

Làm cách nào để phát hiện xem một dòng có trống không?Làm thế nào để phát hiện dòng trống trong khi đọc từ đối tượng istream trong C + +?

tôi có:

1 
2 
3 
4 

5 

Tôi đang đọc này với istream r vậy:

int n; 
r >> n 

Tôi muốn biết khi tôi đạt được khoảng cách giữa 4 và 5. Tôi cố gắng đọc như char và sử dụng .peek() để phát hiện \ n nhưng điều này phát hiện \ n sẽ xuất hiện sau số 1. Bản dịch của dữ liệu đầu vào ở trên là: 1 \ n2 \ n3 \ n4 \ n \ n5 \ n nếu tôi đúng ...

Vì tôi sẽ thao tác các int, tôi thích đọc chúng như int hơn là sử dụng getline và sau đó chuyển đổi thành int ...

+4

¤ Đọc từng dòng vào một chuỗi 'std ::' bằng cách sử dụng' std :: getline'. Kiểm tra độ dài chuỗi. Sử dụng ví dụ: một 'std :: istringstream' để đọc các mục riêng lẻ từ dòng đầu vào. Điều này cũng sẽ giúp bạn với đầu vào sai. Chúc mừng & hth., –

+1

Ồ, tôi vừa xem đoạn cuối, diễn giải "Tôi không muốn sử dụng cách dễ nhất và hợp lý nhất". Trong trường hợp đó, có hàng triệu cách phức tạp hơn. Chỉ có trí tưởng tượng của một người mới có thể đặt giới hạn vào những cách để làm điều gì đó trong thời trang phức tạp ngớ ngẩn. Chúc mừng, –

+2

Được rồi, bạn không cần phải thô lỗ. Ít nhất tôi đã thử nhiều cách khác nhau trước khi đăng bài này. Tôi chỉ muốn biết nếu có một cách khác.Tôi chỉ học C++ atm. Cảm ơn các bình luận istringstream mặc dù, tôi sẽ cố gắng mà trộn với getline! Bạn có thể đăng nó như là câu trả lời nếu bạn muốn, và tôi sẽ chấp nhận nó. – bb2

Trả lời

16

Nó có thể trông như thế này:

#include <iostream> 
#include <sstream> 
using namespace std; 

int main() 
{ 
    istringstream is("1\n2\n3\n4\n\n5\n"); 
    string s; 
    while (getline(is, s)) 
    { 
     if (s.empty()) 
     { 
      cout << "Empty line." << endl; 
     } 
     else 
     { 
      istringstream tmp(s); 
      int n; 
      tmp >> n; 
      cout << n << ' '; 
     } 
    } 
    cout << "Done." << endl; 
    return 0; 
} 

đầu ra:

1 2 3 4 Empty line. 
5 Done. 

Hope this helps.

+0

Tôi cần biết về dòng trống vì đầu vào được chia cho các khối được phân cách bởi khoảng trống đó. Và tôi cần phải biết những gì dữ liệu đi đến những gì khối. – bb2

+2

@ bb2: Trong trường hợp đó, tôi chắc chắn sẽ sử dụng 'std :: getline' để đọc từng dòng dưới dạng một chuỗi'. Sau đó, bạn có thể tạo tạm thời 'istringstream' dựa trên chuỗi đó và đọc từ nó. Tôi đã chỉnh sửa câu trả lời của mình. – LihO

+0

Tôi vừa nhận thấy rằng giải pháp cũng được đề xuất bởi Alf P. Steinbach trong nhận xét cho câu hỏi của bạn. – LihO

4

Nếu bạn thực sự không muốn sử dụng đường dây, mã này hoạt động.

#include <iostream> 
using namespace std; 


int main() 
{ 
    int x; 
    while (!cin.eof()) 
    { 
     cin >> x; 
     cout << "Number: " << x << endl; 

     char c1 = cin.get(); 
     char c2 = cin.peek(); 

     if (c2 == '\n') 
     { 
      cout << "There is a line" << endl; 
     } 
    } 
} 

Nhưng lưu ý rằng điều này không thể di chuyển được. Khi bạn sử dụng hệ thống có các ký tự dòng kết thúc khác với '\ n' thì đó sẽ là vấn đề. Cân nhắc đọc toàn bộ dòng và sau đó trích xuất dữ liệu từ đó.

+0

Không đúng là điều này không mang tính di động. Các newline char (s) của hệ thống được chuyển đổi và từ '\ n'. – rasmus

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