2012-10-16 19 views
5

Ví dụ, khi phân tích một tập tin văn bản, một số lần tập tin này có những thứ như thế này:Làm thế nào để kiểm tra xem chuỗi stringstream >> sẽ không đặt gì trên chuỗi?

keyword a string here 
keyword another string 
keyword 
keyword again a string 

Lưu ý rằng dòng thứ 3 có một chuỗi rỗng (không có gì hay không gian màu trắng) .. Cái này là khi bạn làm stringstream >> laststring, và stringstream có một chuỗi rỗng (null hoặc không gian trắng), nó sẽ không ghi đè lên "laststring", nó sẽ không làm gì cả. Theres anyway để kiểm tra tình trạng này trước khi tay? Tôi không muốn tạo ra một chuỗi trống tạm thời chỉ để kiểm tra nó vẫn còn trống sau khi stringstream >>, có vẻ lame.

Trả lời

15

Khi bạn không thể đọc từ stream - thay đổi trạng thái của nó nên khi đúc đến bool sẽ trả về false:

bool read = (ss >> laststring); 

Xem ideone example

+0

ninja! đây là nó, Im chỉ chờ 5 phút để chấp nhận câu trả lời. – Icebone1000

1

Bạn có thể chỉ biết sau cố gắng đọc dù có điều gì đó hay không. Những gì bạn có thể có thể làm là để bỏ qua khoảng trắng và xem nếu có một tổ chức phi không gian ở vị trí tiếp theo:

if ((in >> std::ws).peek() != std::char_traits<char>::eof()) { 
    ... 
} 

Cho rằng chuỗi rỗng có giá rẻ để tạo ra, tôi sẽ không bận tâm và cố gắng đọc chuỗi. Tuy nhiên, lưu ý rằng việc đọc từ luồng không phải dựa trên dòng, tức là, trong trường hợp của bạn ở trên, bạn cần chia các dòng đầu tiên hoặc sử dụng thứ gì đó như std::getline() để đọc phần thứ hai của dòng.

+0

Từ từ ngữ của câu hỏi, tôi nghĩ rằng anh ta đã có một 'getline', và đang đọc từ chuỗi. nếu không, đọc sẽ không "có một chuỗi rỗng" và sẽ đi đến dòng tiếp theo. –

+0

@MooingDuck: Vâng, vì anh ta lo lắng về việc tạo ra một chuỗi rỗng, nó có vẻ là kỳ lạ khi lần đầu tiên đọc vào một dòng ;-) Điều đó nói rằng, tôi đọc câu hỏi như đọc một dòng duy nhất. Nếu không bỏ qua khoảng trắng sẽ không hoạt động. –

0

Bạn có thể sử dụng đường nối, để đọc một dòng từ tệp. Sau đó, sao chép dòng vào một chuỗi chuỗi và đọc các từ từ chuỗi một tại một thời điểm. Các luồng sẽ tự động ngừng đọc khi chúng hết dòng/từ.

// open file 
std::ifstream fin("text.txt"); 

// 'iterate' through all the lines in the file 
unsigned lineCount = 1; 
std::string line; 
while (std::getline(fin, line)) 
{ 
    // print the line number for debugging 
    std::cout << "Line " << lineCount << '\n'; 

    // copy line into another stream 
    std::stringstream lineStream(line); 

    // 'iterate' through all the words in the line 
    unsigned wordCount = 1; 
    std::string word; 
    while (lineStream >> word) 
    { 
     // print the words for debugging 
     std::cout << '\t' << wordCount++ << ' ' << word << '\n'; 
    } 
} 

Bạn cần phải bao gồm iostream, fstream, sstreamstring.

+0

khá nhiều những gì Im làm, những gì tôi không biết là việc kiểm tra các hoạt động như bool. – Icebone1000

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