ฉันลองมาหลายอย่างแล้ว
std::stringstream m;
m.empty();
m.clear();
ทั้งสองอย่างนี้ใช้ไม่ได้
ฉันลองมาหลายอย่างแล้ว
std::stringstream m;
m.empty();
m.clear();
ทั้งสองอย่างนี้ใช้ไม่ได้
คำตอบ:
สำหรับไลบรารีมาตรฐานทุกประเภทฟังก์ชั่นสมาชิก empty()
คือแบบสอบถามไม่ใช่คำสั่งนั่นหมายถึง "คุณว่างเปล่าหรือไม่" ไม่ใช่ "โปรดละทิ้งเนื้อหาของคุณ"
clear()
ฟังก์ชันสมาชิกจะรับมาจากios
และใช้ในการล้างรัฐผิดพลาดของกระแสเช่นถ้าสตรีมไฟล์ที่มีชุดของรัฐข้อผิดพลาดeofbit
(ในตอนท้ายของแฟ้ม) แล้วโทรclear()
จะตั้งรัฐข้อผิดพลาดกลับไปgoodbit
(ไม่มีข้อผิดพลาด) .
สำหรับการล้างเนื้อหาของ a stringstream
โดยใช้:
m.str("");
ถูกต้องแม้ว่าจะใช้:
m.str(std::string());
เป็นเทคนิคที่มีประสิทธิภาพมากขึ้นเพราะคุณหลีกเลี่ยงการกล่าวอ้างสร้างที่ต้องใช้เวลาstd::string
const char*
แต่คอมไพเลอร์ทุกวันนี้ควรสร้างรหัสเดียวกันในทั้งสองกรณี - ดังนั้นฉันจะไปกับสิ่งที่อ่านได้มากกว่า
คุณสามารถล้างสถานะข้อผิดพลาดและล้างค่าสตริงสตรีมทั้งหมดในหนึ่งบรรทัด
std::stringstream().swap(m); // swap m with a default constructed stringstream
สิ่งนี้จะรีเซ็ต m เป็นสถานะที่สร้างเป็นค่าเริ่มต้นได้อย่างมีประสิทธิภาพ
นี่ควรเป็นวิธีที่น่าเชื่อถือที่สุดโดยไม่คำนึงถึงคอมไพเลอร์:
m=std::stringstream();
mm.clear(); mm.str("");
ทำกลอุบาย (ไม่มี C ++ 11, การแลกเปลี่ยนอื่นจะดีกว่า)
swap
ดีกว่าการย้ายที่ได้รับมอบหมาย?
ฉันมักจะกำหนดขอบเขต:
{
std::stringstream ss;
ss << "what";
}
{
std::stringstream ss;
ss << "the";
}
{
std::stringstream ss;
ss << "heck";
}
stringstream?
2 เซนต์ของฉัน:
สิ่งนี้ดูเหมือนจะใช้งานได้สำหรับฉันใน xcode และ dev-c ++ ฉันมีโปรแกรมในรูปแบบของเมนูว่าถ้าดำเนินการซ้ำตามคำขอของผู้ใช้จะเติมตัวแปรสตริงสตรีมซึ่งจะทำงานได้ในครั้งแรกที่รหัสจะ เรียกใช้ แต่จะไม่ล้างสตริงสตรีมในครั้งถัดไปที่ผู้ใช้จะเรียกใช้รหัสเดียวกัน แต่สุดท้ายโค้ดสองบรรทัดด้านล่างจะถูกล้างค่าตัวแปร stringstream ทุกครั้งก่อนที่จะเติมตัวแปรสตริง (2 ชั่วโมงของการทดลองและข้อผิดพลาดและการค้นหาของ Google), btw, ใช้แต่ละบรรทัดด้วยตัวเองจะไม่ทำเคล็ดลับ
//clear the stringstream variable
sstm.str("");
sstm.clear();
//fill up the streamstream variable
sstm << "crap" << "morecrap";
มันเป็นปัญหาทางความคิด
Stringstream เป็นกระแสจึงวนซ้ำไปข้างหน้าไม่สามารถส่งคืนได้ ในสตริงสตรีมผลลัพธ์คุณต้องมี flush () เพื่อกำหนดค่าเริ่มต้นใหม่เช่นเดียวกับในสตรีมเอาต์พุตอื่น ๆ
สิ่งเหล่านี้จะไม่ทิ้งข้อมูลใน stringstream ใน gnu c ++
m.str("");
m.str() = "";
m.str(std::string());
ต่อไปนี้จะทำให้ stringstream ว่างสำหรับฉัน:
m.str().clear();