คุณจะล้างตัวแปร stringstream ได้อย่างไร


คำตอบ:


771

สำหรับไลบรารีมาตรฐานทุกประเภทฟังก์ชั่นสมาชิก empty()คือแบบสอบถามไม่ใช่คำสั่งนั่นหมายถึง "คุณว่างเปล่าหรือไม่" ไม่ใช่ "โปรดละทิ้งเนื้อหาของคุณ"

clear()ฟังก์ชันสมาชิกจะรับมาจากiosและใช้ในการล้างรัฐผิดพลาดของกระแสเช่นถ้าสตรีมไฟล์ที่มีชุดของรัฐข้อผิดพลาดeofbit(ในตอนท้ายของแฟ้ม) แล้วโทรclear()จะตั้งรัฐข้อผิดพลาดกลับไปgoodbit (ไม่มีข้อผิดพลาด) .

สำหรับการล้างเนื้อหาของ a stringstreamโดยใช้:

m.str("");

ถูกต้องแม้ว่าจะใช้:

m.str(std::string());

เป็นเทคนิคที่มีประสิทธิภาพมากขึ้นเพราะคุณหลีกเลี่ยงการกล่าวอ้างสร้างที่ต้องใช้เวลาstd::string const char*แต่คอมไพเลอร์ทุกวันนี้ควรสร้างรหัสเดียวกันในทั้งสองกรณี - ดังนั้นฉันจะไปกับสิ่งที่อ่านได้มากกว่า


105
นี่คือสิ่งที่เกิดขึ้นเมื่อคุณลืมส่วน "clear ()" stackoverflow.com/q/2848087/635549
galath

8
@ KshitijBanerjee ฉันคิดว่าใน C ++ m.str () และ m.str ("") เป็นสองฟังก์ชันที่แตกต่างกัน m.str () เรียกใช้ฟังก์ชันที่ไม่ได้คาดหวังว่าพารามิเตอร์ใด ๆ ในขณะที่ m.str ("") จะเรียกใช้ฟังก์ชันที่รับพารามิเตอร์ const char * m.str () อาจถูกนำมาใช้เป็นฟังก์ชั่นรับซึ่งส่งกลับสตริงในขณะที่ m.str ("") อาจได้รับการดำเนินการเป็นฟังก์ชั่นการตั้งค่า
Dinesh PR

4
ในฐานะที่เป็น galath กล่าวมันเป็นสิ่งสำคัญมากที่จะเพิ่ม m.clear (); นอกจาก m.str (""); มิฉะนั้นคุณจะได้รับปัญหาถ้าในบางครั้งคุณเติมสตริงสตรีมด้วยสตริงว่าง
Sputnik

1
@ anthropod ใช่นั่นเป็นปีที่แล้ว ฉันได้รับตั้งแต่มันทำงาน
James

1
โอ้เด็กชายคนนี้ใช้งานง่าย เหมือนกับทุกสิ่งทุกอย่างที่เกี่ยวกับ C ++!
ดวงจันทร์ที่แดดจัด

47

คุณสามารถล้างสถานะข้อผิดพลาดและล้างค่าสตริงสตรีมทั้งหมดในหนึ่งบรรทัด

std::stringstream().swap(m); // swap m with a default constructed stringstream

สิ่งนี้จะรีเซ็ต m เป็นสถานะที่สร้างเป็นค่าเริ่มต้นได้อย่างมีประสิทธิภาพ


3
นี่เป็นวิธีที่มีประสิทธิภาพและสวยงามที่สุดเมื่อเทียบกับคำตอบอื่น ๆ ทั้งหมดที่นี่ อย่างไรก็ตาม std :: stringstream :: swap เป็นคุณสมบัติ c ++ 11 และวิธีนี้ไม่สามารถใช้ได้กับคอมไพเลอร์ c ++ 11 ก่อนหน้า
101010

4
คุณลักษณะยังคงหายไปใน GNU g ++ v4.8 โปรดดูstackoverflow.com/questions/24429441/ …
Joachim W

7
@ 101010: การแลกเปลี่ยนดีกว่าการย้ายที่มอบหมายได้อย่างไร?
Deduplicator

2
@AsetD: แม้ว่าจะไม่มีข้อยกเว้นคุณลืมการสร้างเริ่มต้นชั่วคราวหรือไม่
Deduplicator

3
นี่คือประสิทธิภาพต่ำ เมื่อฉันต้องการใช้ต้นฉบับเอสเอสอีกครั้ง มันเป็นการแลกเปลี่ยนที่ว่างเปล่าสำหรับฉัน
จาง


33

นี่ควรเป็นวิธีที่น่าเชื่อถือที่สุดโดยไม่คำนึงถึงคอมไพเลอร์:

m=std::stringstream();

2
ในความคิดของฉันดีกว่าเพราะ m.str (""); ทำให้สตริงสตรีมของฉันติดอยู่กับค่าว่างเปล่าไม่ว่าฉันจะพยายามทำอะไร แต่การใช้สิ่งนี้ฉันไม่มีปัญหานั้น
gelatine1

3
ฉันพบปัญหาเดียวกันเพราะฉันmm.clear(); mm.str("");ทำกลอุบาย (ไม่มี C ++ 11, การแลกเปลี่ยนอื่นจะดีกว่า)
hochl

1
@hochl: ทำไมจะswapดีกว่าการย้ายที่ได้รับมอบหมาย?
Deduplicator

4
มันไม่ดีสำหรับทุกสถานการณ์ สิ่งนี้จะจัดสรรบัฟเฟอร์ใหม่ทุกครั้งในขณะที่ mm.str ("") จะไม่
Shital Shah

3
กรณีใช้งานหลักของฉันสำหรับการล้างวัตถุ stringstream คือการรักษาวัตถุ stringlocal รอบ ๆ เพื่อป้องกันการสร้างอินสแตนซ์ที่ไม่จำเป็นของ stringstream - instantiating วัตถุ stringstream ใหม่คัดลอกวัตถุสถานที่ทั่วโลก - ในทางทฤษฎีแล้วนี่คือรวดเร็วและเกี่ยวข้องกับการเพิ่มอะตอมเท่านั้น ในระดับของการเกิดขึ้นพร้อมกันที่ฉันจัดการกับมันมักจะทำให้หมดอำนาจ
Spacemoose

12

ฉันมักจะกำหนดขอบเขต:

{
    std::stringstream ss;
    ss << "what";
}

{
    std::stringstream ss;
    ss << "the";
}

{
    std::stringstream ss;
    ss << "heck";
}

1
นี้ดีกว่าการล้างstringstream?
Robur_131

11

2 เซนต์ของฉัน:

สิ่งนี้ดูเหมือนจะใช้งานได้สำหรับฉันใน xcode และ dev-c ++ ฉันมีโปรแกรมในรูปแบบของเมนูว่าถ้าดำเนินการซ้ำตามคำขอของผู้ใช้จะเติมตัวแปรสตริงสตรีมซึ่งจะทำงานได้ในครั้งแรกที่รหัสจะ เรียกใช้ แต่จะไม่ล้างสตริงสตรีมในครั้งถัดไปที่ผู้ใช้จะเรียกใช้รหัสเดียวกัน แต่สุดท้ายโค้ดสองบรรทัดด้านล่างจะถูกล้างค่าตัวแปร stringstream ทุกครั้งก่อนที่จะเติมตัวแปรสตริง (2 ชั่วโมงของการทดลองและข้อผิดพลาดและการค้นหาของ Google), btw, ใช้แต่ละบรรทัดด้วยตัวเองจะไม่ทำเคล็ดลับ

//clear the stringstream variable

sstm.str("");
sstm.clear();

//fill up the streamstream variable
sstm << "crap" << "morecrap";

-1

มันเป็นปัญหาทางความคิด

Stringstream เป็นกระแสจึงวนซ้ำไปข้างหน้าไม่สามารถส่งคืนได้ ในสตริงสตรีมผลลัพธ์คุณต้องมี flush () เพื่อกำหนดค่าเริ่มต้นใหม่เช่นเดียวกับในสตรีมเอาต์พุตอื่น ๆ


2
en.cppreference.com/w/cpp/io/basic_ostream/flush flush ประสานกับอุปกรณ์จัดเก็บข้อมูลที่เกี่ยวข้อง นี่ไม่ใช่การเริ่มต้นใหม่เหมือนกัน
ชัดเจนขึ้น

-12

สิ่งเหล่านี้จะไม่ทิ้งข้อมูลใน stringstream ใน gnu c ++

    m.str("");
    m.str() = "";
    m.str(std::string());

ต่อไปนี้จะทำให้ stringstream ว่างสำหรับฉัน:

    m.str().clear();

7
ฉันไม่แน่ใจว่าสิ่งนี้จะได้ผลเพราะเหตุผลเดียวกันกับที่ bernhardrusch ใช้ไม่ได้ ฟังก์ชัน. str () ส่งคืนสำเนาและการล้างสำเนาจะไม่ทำอะไรเลย
Verdagon

1
โซลูชันนี้ใช้ไม่ได้กับ Microsoft Visual C ++
Zak

ไม่ถูกต้อง Clear จะทำงานกับสตริงที่ส่งคืนจากสตรีมไม่ใช่สตรีมเอง
Joey Carson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.