ฟังก์ชันไอสตรีม C++

Fangkchan Xi Stri M C



คำว่า “สตรีม” ใน C++ อธิบายการไหลของอักขระระหว่างเธรดของโปรแกรมและ i/o คลาสสตรีม C++ จำเป็นสำหรับการดำเนินการอินพุตและเอาต์พุตบนอุปกรณ์และไฟล์ IO คลาสเหล่านี้ออกแบบมาเพื่อจัดการอินพุตและเอาต์พุตของโปรแกรมและมีฟังก์ชันการทำงานเฉพาะ

ลำดับชั้นของคลาสสตรีม

คลาส C++ ประกอบด้วยเมธอดที่จำเป็นในการจัดการและควบคุมข้อมูลที่อยู่ในนั้น

float, doubles และ class เป็นประเภทข้อมูลที่คล้ายกับ int ตัวแปรเฉพาะที่มีคลาสเป็นชนิดข้อมูลจะเรียกว่าอ็อบเจ็กต์ C++ ออบเจ็กต์พิเศษที่กำหนดไว้ล่วงหน้า 'cin' และ 'cout' มีคลาสต่างๆ ตามประเภทข้อมูล







ข้อมูลที่เขียนไปยัง 'cout' หรืออ่านจาก 'cin' เป็นตัวอย่างของข้อมูลที่ไหลเข้าหรือออกจากโปรแกรมในภาษา C++ ขณะนี้ เรากำลังพิจารณาสี่คลาสต่อไปนี้สำหรับคลาสนี้:



สตรีมมัน
สตรีมอินพุตนี้อาจให้บริการวัตถุประสงค์ใดก็ได้ ภาพประกอบของ istream คือ cin



Ostream
เป็นสตรีมเอาต์พุตที่มีการใช้งานหลายอย่าง Ostreams มาในรูปของ cout และ cin





ถ้าสตรีม
เป็นสตรีมของไฟล์อินพุต

ของกระแสน้ำ
เป็นสตรีมของไฟล์เอาต์พุต การสืบทอดเป็นแนวคิดที่ใช้อย่างมากในการเขียนโปรแกรมเชิงวัตถุ เช่นใน C++ โดยที่บางคลาสใช้คุณลักษณะของคลาสอื่นที่สร้างไว้แล้ว คลาสบรรพบุรุษจะกลายเป็นความเชี่ยวชาญเฉพาะทางผ่านการรวมคุณสมบัติใหม่



ถ้าสตรีมคลาส
ifstream สามารถปฏิบัติได้ในลักษณะเดียวกับ istream ซึ่งเป็นสิ่งที่เป็นอยู่

ของสตรีมคลาส
ในลักษณะเดียวกับที่ ifstreams ทำงาน แต่มีเอาต์พุตแทนอินพุต, ofstream เป็นสตรีมไฟล์เอาต์พุต มีการใช้ Ofstream ในลักษณะเดียวกับ Cout หลังจากสร้าง เปิด และตรวจสอบว่าไม่มีข้อผิดพลาด

คลาส Ios
จากคลาสนี้ คลาสสตรีมทั้งหมดลงมา กระแสข้อมูลขาเข้าและขาออกเป็นสองประเภทที่แตกต่างกัน

มันกำหนดส่วนของสตรีมที่ไม่ขึ้นอยู่กับสถานะอินพุตหรือเอาต์พุตของสตรีมในฐาน ios

ตรงข้ามกับสมาชิกที่กล่าวถึงในฐาน ios สมาชิกที่ขึ้นอยู่กับพารามิเตอร์เทมเพลตจะอธิบายไว้ในส่วนนี้

สตรีม (อินพุต)
เนื่องจากความซับซ้อนของไลบรารี iostream เราจึงไม่สามารถครอบคลุมทั้งหมดได้ในบทเรียนเหล่านี้ อย่างไรก็ตาม เราจะเน้นฟังก์ชันที่ใช้บ่อยที่สุด ในส่วนนี้ เราจะดูคลาสอินพุตจากมุมต่างๆ (istream)

เราได้เรียนรู้ว่าตัวดำเนินการสกัด (>>) จะถูกใช้เพื่อรับข้อมูลจากสตรีมอินพุต

ลำธาร

ในภาษาการเขียนโปรแกรม C++ สตรีมอินพุตจะได้รับการจัดการโดยคลาส istream อินพุตถูกอ่านและทำความเข้าใจเป็นชุดอักขระโดยใช้ออบเจ็กต์สตรีมอินพุตเหล่านี้ อินพุตถูกจัดการโดย cin

คลาสสมาชิก

istream::sentry
คลาสที่ดำเนินการหลายอย่างและทุกครั้งที่มีการดำเนินการตามขั้นตอนการป้อนข้อมูล ตัวทำลายล้างไม่จำเป็นต้องดำเนินการใดๆ อย่างไรก็ตาม การใช้งานอาจดำเนินการเริ่มต้นเพิ่มเติมหรือล้างข้อมูลบนสตรีมที่ใช้ร่วมกันโดยการดำเนินการอินพุตทั้งหมดโดยใช้การสร้างและการทำลายวัตถุยาม

ฟังก์ชั่น

istream::gcount
ให้จำนวนอักขระที่ได้รับจากการดำเนินการอินพุตที่ยังไม่ได้จัดรูปแบบล่าสุดของออบเจ็กต์ โพรซีเดอร์อินพุตที่ไม่ได้จัดรูปแบบ—รับ, รับไลน์, เพิกเฉย, แอบมอง, อ่าน, อ่านบางส่วน, ใส่กลับ, และ unget— เปลี่ยนค่าที่ส่งคืนโดยฟังก์ชันนี้ อย่างไรก็ตาม โปรดทราบว่าการเรียก peeks, putback หรือ unget จะไม่แยกอักขระใดๆ ด้วยเหตุนี้ การนับจะคืนค่าเป็น 0 เสมอ

istream::get
อักขระตัวเดียวนำอักขระหนึ่งตัวออกจากสตรีม อักขระถูกตั้งค่าเป็นค่าอาร์กิวเมนต์หรือส่งคืน (ลายเซ็นแรก) (ลายเซ็นที่สอง)

สตริง C: หากมีอักขระคั่นอยู่ อักขระนั้นจะไม่ถูกลบออกจากลำดับอินพุต แต่จะเก็บไว้เป็นอักขระต่อไปนี้เพื่อดึงข้อมูลจากสตรีมหากมีอยู่

istream::getline
ลบอักขระออกจากสตรีมเป็นอินพุตที่ไม่ได้จัดรูปแบบและบันทึกเป็นสตริง c ในตัวแปร 's' จนกว่าอักขระที่แยกออกมาจะกลายเป็นอักขระคั่นหรืออักขระ 'n' ถูกเขียนเป็น 's' นอกจากนี้ เมธอดจะหยุดการแยกอักขระหากถึงจุดสิ้นสุดของไฟล์

ภายใน ฟังก์ชันจะสร้างวัตถุก่อนที่จะเข้าถึงลำดับอินพุต สุดท้าย มันจะฆ่าอ็อบเจ็กต์ก่อนที่จะส่งคืน โดยแยกอักขระออกจากออบเจกต์บัฟเฟอร์สตรีมที่เกี่ยวข้อง (สมมติว่าทุกอย่างอยู่ในลำดับ) ราวกับว่าดำเนินการหนึ่งในเมธอดของสมาชิก sbumpc หรือ sgetc

istream::ละเว้น
อักขระจะถูกนำออกจากลำดับอินพุตและละทิ้งทีละตัวจนกว่าอักขระ 'n' ตัวใดตัวหนึ่งจะถูกนำออกหรือตัวหนึ่งเปรียบเทียบเท่ากับตัวคั่น นอกจากนี้ หากถึงจุดสิ้นสุดของไฟล์ ฟังก์ชันจะหยุดการแยกอักขระ ฟังก์ชันจะตั้งค่าสถานะ 'eofbit' หากมาถึงจุดนี้เร็วเกินไป (ก่อนที่จะแยกอักขระ n ตัวหรือพบเดลิม)

ก่อนเข้าถึงลำดับอินพุต ฟังก์ชันจะสร้างวัตถุยามภายใน (โดยที่ noskipws จะเป็นจริง) ในที่สุด มันจะฆ่าวัตถุยามก่อนที่จะกลับมา โดยแยกอักขระออกจากวัตถุบัฟเฟอร์สตรีมที่เกี่ยวข้อง (สมมติว่าทุกอย่างอยู่ในลำดับ) ราวกับว่าดำเนินการหนึ่งในวิธีการของสมาชิก: sbumpc หรือ sgetc

istream::operator>>
ตัวดำเนินการแยก (>>) ใช้ตัวดำเนินการนี้กับกระแสข้อมูลเข้า มีสมาชิกเป็นฟังก์ชันมากเกินไป

ประเภทเลขคณิต

อักขระจะถูกนำออกจากสตรีมและแยกวิเคราะห์ตามลำดับเพื่อแสดงค่าของประเภทที่ถูกต้อง จากนั้นจะบันทึกเป็นค่าของ 'val' ก่อนเข้าถึงลำดับอินพุต ฟังก์ชันจะสร้างวัตถุยามภายใน (noskipws จะเป็นเท็จ) หากทุกอย่างเรียบร้อยดี ก็จะรัน num get::get เพื่อดำเนินการแยกและแยกวิเคราะห์ให้เสร็จสิ้นในขณะที่แก้ไขสถานะภายในของสตรีม ในที่สุดวัตถุยามจะถูกทำลายก่อนที่มันจะจากไป

ฟังก์ชันนี้สร้างวัตถุยามภายในก่อนที่จะอ่านลำดับอินพุต โดยจะถือเป็นการดำเนินการอินพุตที่จัดรูปแบบ ในที่สุด มันจะฆ่าวัตถุยามก่อนที่จะกลับมา โดยแยกอักขระออกจากวัตถุบัฟเฟอร์สตรีมที่เกี่ยวข้อง (สมมติว่าทุกอย่างอยู่ในลำดับ) ราวกับว่าดำเนินการหนึ่งในเมธอดของสมาชิก sbumpc หรือ sgetc

หุ่นยนต์

pf (*this) ถูกเรียก โดยที่ pf อาจเป็นตัวบงการ Manipulators เป็นกิจวัตรที่สร้างขึ้นโดยเฉพาะเพื่อเรียกเมื่อมีการเรียกใช้ตัวดำเนินการนี้ ลำดับอินพุตไม่ได้รับผลกระทบจากขั้นตอนนี้และไม่มีการแยกอักขระ

istream::putback
อักขระที่กู้คืนจะพยายามย้ายเคอร์เซอร์ลงหนึ่งอักขระในสตรีม เพื่อให้สามารถดึงอักขระตัวสุดท้ายที่ดึงมาจากสตรีมได้อีกครั้งโดยการดำเนินการอินพุต

ก่อนเข้าถึงลำดับอินพุต ฟังก์ชันจะสร้างวัตถุยามภายใน จากนั้นจะเรียก sputbackc(c) บนวัตถุบัฟเฟอร์สตรีมที่เกี่ยวข้อง (ถ้าดี) ในที่สุดวัตถุยามจะถูกทำลายก่อนที่มันจะจากไป

istream::read
อ่านบล็อกข้อมูล:

อักขระ 'n' ถูกนำมาจากสตรีมและจัดเก็บในอาร์เรย์ที่ชี้ไปที่ 's' ฟังก์ชันนี้เพียงทำซ้ำกลุ่มข้อมูลโดยไม่ตรวจสอบเนื้อหาของข้อมูลหรือเพิ่มอักขระว่างในตอนท้าย

ภายในฟังก์ชัน วัตถุยามจะถูกสร้างขึ้นก่อนการเข้าถึงลำดับอินพุต ในที่สุด มันจะฆ่าวัตถุยามก่อนที่จะกลับมา โดยแยกอักขระออกจากวัตถุบัฟเฟอร์สตรีมที่เกี่ยวข้อง (สมมติว่าทุกอย่างอยู่ในลำดับ) ราวกับว่าดำเนินการหนึ่งในวิธีการของสมาชิก: sbumpc หรือ sgetc

จำนวนสมาชิกที่เรียกจะส่งคืนจำนวนอักขระทั้งหมดที่ฟังก์ชันนี้อ่านและจัดเก็บอย่างถูกต้อง

istream::readsome
ฟังก์ชันนี้ขึ้นอยู่กับการทำงานภายในของออบเจ็กต์บัฟเฟอร์สตรีมที่เชื่อมโยงกับสตรีม ซึ่งลักษณะการทำงานส่วนใหญ่กำหนดไว้สำหรับคลาสมาตรฐาน

ภายในฟังก์ชัน วัตถุยามจะถูกสร้างขึ้นก่อนการเข้าถึงลำดับอินพุต จากนั้น (หากสำเร็จ) จะเรียกใช้ฟังก์ชันสมาชิกในความพร้อมใช้งานของออบเจ็กต์บัฟเฟอร์สตรีมเพื่อกำหนดจำนวนอักขระที่พร้อมใช้งานก่อนที่จะเรียก 'sbumpc' เพื่อแยกอักขระออกตามจำนวนนั้น (หรือ sgetc) ในที่สุดวัตถุยามจะถูกทำลายก่อนที่มันจะจากไป

istream::seekg
ตำแหน่งในบรรทัดอินพุตกำหนดตำแหน่งที่จะดึงอักขระต่อไปนี้ออกจากสตรีมอินพุต ก่อนอ่านลำดับอินพุต ฟังก์ชันจะสร้างวัตถุยามภายใน จากนั้น (ถ้าตกลง) จะทำการเรียกหนึ่งในสองรายการไปยังอ็อบเจ็กต์บัฟเฟอร์สตรีมที่เกี่ยวข้อง: pubseekpos (1) หรือ pubeekoff (2), (ถ้ามี) ในที่สุดก็ลบล้างไอเทมยามและจากไป

istream::sync
จัดตำแหน่งบัฟเฟอร์อินพุต:

นำลำดับอินพุตที่ควบคุมของบัฟเฟอร์สตรีมที่เชื่อมโยงมาซิงค์ การใช้งานเฉพาะของวัตถุบัฟเฟอร์สตรีมที่เชื่อมต่อกับสตรีมจะกำหนดลักษณะเฉพาะของการดำเนินการ

istream::tellg
รับตำแหน่งของลำดับอินพุต:

มันให้ตำแหน่งของตัวละครปัจจุบันในกระแสอินพุต ฟังก์ชันจะคืนค่า -1 หากสมาชิกล้มเหลว มันจะคืนค่าเป็น จริง

มันจะส่งคืน rdbuf()->pubseeoff ถ้าไม่ใช่ (0,cur,in) ในที่สุดวัตถุยามจะถูกทำลายก่อนที่มันจะจากไป

istream::unget
ลบอักขระ:

พยายามย้ายเคอร์เซอร์ลงหนึ่งอักขระในสตรีมเพื่อให้สามารถดึงอักขระตัวสุดท้ายที่ดึงมาจากสตรีมได้อีกครั้งโดยการดำเนินการอินพุต

ไม่ใช่สมาชิก

โอเปอเรเตอร์>> (istream)
โอเปอเรเตอร์การแยก (>>) จัดเตรียมอินพุตที่จัดรูปแบบด้วยการดำเนินการนี้เมื่อนำไปใช้กับสตรีมอินพุต

อักขระตัวหนึ่ง: ลำดับอักขระนำอักขระตัวถัดไปออกมาและเก็บเป็นค่าของ 'c' กระบวนการแยกอักขระออกจากคือและเก็บไว้ใน s ในรูปแบบ c-string จะหยุด (หากความกว้างไม่เป็นศูนย์) เมื่อพบอักขระช่องว่างหรือ (ความกว้าง ()-1) อักขระถูกแยกออก

Extraction of rvalue: เปิดใช้งานการแยกจากอ็อบเจ็กต์ rvalue istream ซึ่งมีผลลัพธ์เหมือนกับการแยกจาก lvalues: มันเรียก is>>Val

ตัวอย่าง 1

ในกรณีนี้ เราจะตรวจสอบว่าเราอาจได้รับค่าใด ๆ จากผู้ใช้แล้วแสดงผลบนหน้าจอ

#include
โดยใช้ เนมสเปซ มาตรฐาน ;
int หลัก ( )
{
int ไม่ ;
ศาล << 'กรุณากรอกตัวเลข' ;
การกิน >> ไม่ ;
ศาล << 'ค่าที่ป้อนคือ: ' << ไม่ << ' \n ' ;
}

เราจะรวมไฟล์ส่วนหัว ต่อไป เราจะใช้เนมสเปซ 'std' ในเนมสเปซมาตรฐาน เราจะเรียกฟังก์ชัน main() ตัวแปรที่ชื่อว่า “no” จะถูกประกาศภายในเมธอดนี้ ชนิดข้อมูล 'int' จะแสดงสำหรับตัวแปรนี้ คำว่า 'int' เป็นตัวย่อของจำนวนเต็ม หลังจากนั้นจะใช้คำสั่ง 'cout' คำสั่งนี้จะพิมพ์บรรทัด

ผู้ใช้จะป้อนค่าสุ่มหลังจากข้อความนี้ปรากฏบนหน้าจอ จากนั้นจะใช้คำสั่ง 'cin' คำสั่งนี้ต้องการให้ผู้ใช้ระบุค่า หมายเลขที่ป้อนของผู้ใช้จะถูกบันทึกไว้ในตัวแปร ค่าที่ผู้ใช้ให้มาจะแสดงบนหน้าจอโดยใช้คำสั่ง 'cout'

ตัวอย่าง 2

ในกรณีนี้ เราจะเห็นว่าเราได้รับชื่อจากผู้ใช้อย่างไร แล้วแสดงบนหน้าจอเป็นผล

#include
โดยใช้ เนมสเปซ มาตรฐาน ;

int หลัก ( )

{

char ชื่อ [ 125 ] ;
ศาล << 'ใส่ชื่อของคุณ' << endl ;


การกิน >> ws ;

การกิน . getline ( ชื่อ, 125 ) ;

ศาล << ชื่อ << endl ;

กลับ 0 ;

}

เราจะรวมไฟล์ส่วนหัว ต่อไป เราจะใช้เนมสเปซมาตรฐานเป็น 'std' เราจะเรียกใช้ฟังก์ชัน main() ภายในเมธอดนี้ เราจะประกาศตัวแปร ตัวแปรนี้เก็บประเภทข้อมูล 'ถ่าน' จากนั้นใช้คำสั่ง 'cout' คำสั่งนี้จะแสดงข้อความ 'Enter your name' บนหน้าจอ หลังจากแสดงข้อความนี้บนหน้าจอแล้ว ผู้ใช้จะป้อนชื่อใดก็ได้ จากนั้นเราจะใช้คำสั่ง 'cin'

คำสั่งนี้ใช้ค่าจากผู้ใช้ ชื่อที่ระบุจะถูกเก็บไว้ในตัวแปร 'ws' ในที่นี้ เราจะใช้คำสั่ง 'cin' อีกครั้ง ภายในคำสั่งนี้ ฟังก์ชัน getline() จะถูกนำไปใช้ ฟังก์ชันนี้มีพารามิเตอร์ซึ่งรวมถึงชื่อที่ผู้ใช้ป้อนและความยาวของชื่อ คำสั่ง 'cout' จะใช้เพื่อแสดงชื่อที่ผู้ใช้ให้มา หากต้องการยกเลิกโค้ด จะใช้คำสั่ง 'return 0'

บทสรุป

อันดับแรก เราได้พูดถึงฟังก์ชัน C++ istream จากนั้นเราสังเกตหน้าที่หลายประการและคำจำกัดความที่สำคัญที่กล่าวถึง ในบทความนี้ เราได้เรียกใช้โค้ดต่างๆ ที่มีฟังก์ชัน istream ที่หลากหลาย ในรหัสแรก เราจะนำหมายเลขใดๆ จากผู้ใช้มาแสดงหมายเลขนั้นบนหน้าจอ ในอันที่สอง ผู้ใช้ป้อนชื่อและพิมพ์ชื่อนั้นบนหน้าจอ