2012-08-24 47 views
12

Những chủ đề không trả lời tôi:làm thế nào để tái sử dụng stringstream

resetting a stringstream

How do you clear a stringstream variable?

 std::ifstream file(szFIleName_p); 
     if(!file) return false; 

     // create a string stream for parsing 

     std::stringstream szBuffer; 

     std::string szLine;  // current line 
     std::string szKeyWord; // first word on the line identifying what data it contains 

while(!file.eof()){ 

      // read line by line 

      std::getline(file, szLine); 

      // ignore empty lines 

      if(szLine == "") continue; 

      szBuffer.str(""); 
      szBuffer.str(szLine); 
      szBuffer>>szKeyWord; 

szKeyword sẽ luôn chứa từ đầu tiên, szBuffer không đang được thiết lập lại, không thể tìm thấy một ví dụ rõ ràng ở bất cứ nơi nào về cách sử dụng stringstream.

Code mới sau khi câu trả lời:

... 
      szBuffer.str(szLine); 
      szBuffer.clear(); 
      szBuffer>>szKeyWord; 
... 

Ok, đó là phiên bản cuối cùng của tôi:

 std::string szLine;  // current line 
     std::string szKeyWord; // first word on the line identifying what data it contains 

     // read line by line 

     while(std::getline(file, szLine)){ 

      // ignore empty lines 

      if(szLine == "") continue; 

      // create a string stream for parsing 

      std::istringstream szBuffer(szLine); 
      szBuffer>>szKeyWord; 
+0

bản sao có thể có của [Làm thế nào để tái sử dụng một ostringstream?] (Http://stackoverflow.com/questions/624260/how-to-reuse-an-ostringstream) – maxschlepzig

Trả lời

21

Bạn không clear() dòng sau khi gọi str(""). Hãy xem qua số this answer, nó cũng giải thích lý do bạn nên đặt lại bằng cách sử dụng str(std::string()). Và trong trường hợp của bạn, bạn cũng có thể đặt lại nội dung chỉ bằng cách sử dụng str(szLine).

Nếu bạn không gọi clear(), những lá cờ của các dòng (như eof) sẽ không được thiết lập lại, dẫn đến hành vi đáng ngạc nhiên;)

+0

dammit, tôi thấy một chủ đề nói rõ ràng chỉ xóa cờ lỗi ..wtf người đàn ông .. bạn có thể giải thích cho tôi tại sao tôi cần cả hai? sử dụng chỉ rõ ràng dường như làm việc ..? – Icebone1000

+0

Chúng có liên quan. Nếu bạn không gọi 'clear()', luồng sẽ vẫn còn trong trạng thái 'eof'. –

+0

Vì vậy, nhiệm vụ quan trọng rõ ràng về thiết lập lại là đặt con trỏ tìm kiếm (bất cứ điều gì nó được gọi là) ở đầu một lần nữa? Cuối cùng, đó là những gì tôi cần: szBuffer.str (szLine); szBuffer.clear(); – Icebone1000

7

Nó phụ thuộc những gì bạn đang làm với nó. Nói chung, chỉ cần tạo mới istringstream hoặc ostringstream mới dễ dàng hơn. Để "đặt lại" luồng, bạn phải xóa bộ đệm, xóa mọi cờ lỗi, đặt lại bất kỳ cờ định dạng nào, cộng với độ chính xác và điền, lại imbue nó bằng ngôn ngữ gốc và không quên bất kỳ thông tin định dạng mở rộng nào được tạo với một giá trị được trả về từ xalloc. Tóm lại, không thể nhận được chính xác.

Và trong khi tôi ở đó, vòng lặp của bạn sai, và có thể dẫn đến kết quả là dòng cuối cùng đang được xử lý hai lần. file.eof() chỉ có một ý nghĩa có thể sử dụng sau khi đầu vào không thành công (và thậm chí sau đó, nó không phải là 100% đáng tin cậy). gì bạn muốn là:

std::string line; 
while (std::getline(file, line)) { 
    if (!line.empty()) { 
     std::istringstream buffer(line); 
     // ... 
    } 
} 

(Trên thực tế, có thể bạn muốn cắt đuôi khoảng trắng từ dòng trước khi thử nghiệm cho sản phẩm nào.)

+4

Tôi thích cách có rất nhiều tài nguyên ngoài kia giải thích tất cả những thông tin rất rõ ràng trên đó, theo cách được tổ chức và có tài liệu tốt, chứ không phải – Icebone1000

0

ss là stringstream. Sử dụng

  • bước đầu tiên: ss.clear();
  • bước thứ hai: ss.str ("");

để sử dụng lại chuỗi - hoàn toàn xóa luồng chuỗi.

1

Trong hầu hết các trường hợp, việc tạo mới istringstream hoặc ostringstream mới dễ dàng hơn thay vì đặt lại cùng một cái.

Tuy nhiên, nếu bạn muốn bực bội họ:

  • cờ bực bội của con suối (để tránh vấn đề nghi ngờ) sử dụng clear().

  • Trong khi bạn có thể sửa nội dung của số stringstream bằng cách sử dụng str (""), vì mục đích hiệu quả, chúng tôi có thể thích str(std::string()).

0

Nếu bạn có con suối trong một thành viên lớp, sử dụng unique_ptr<stringstream>, sau đó chỉ cần reset(new stringstream(...)) để tái sử dụng nó.

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