Friday 18 August 2017

Freopen Stdout ไบนารี ตัวเลือก


เปิดไฟล์ที่มีชื่อระบุไว้ในชื่อไฟล์พารามิเตอร์และเชื่อมโยงกับสตรีมที่สามารถระบุได้ในการดำเนินการในอนาคตโดยตัวชี้ FILE กลับ การดำเนินงานที่ได้รับอนุญาตในสตรีมและวิธีการเหล่านี้จะถูกกำหนดโดยพารามิเตอร์โหมด สตรีมที่ส่งคืนจะถูกบัฟเฟอร์เต็มตามค่าเริ่มต้นหากไม่ทราบถึงอุปกรณ์เชิงโต้ตอบ (ดู setbuf) ตัวชี้ที่ส่งคืนสามารถถูกแยกออกจากไฟล์ได้โดยการเรียก fclose หรือ freopen ไฟล์ที่เปิดอยู่ทั้งหมดจะถูกปิดโดยอัตโนมัติเมื่อสิ้นสุดโปรแกรมตามปกติ สภาพแวดล้อมการทำงานสนับสนุนไฟล์ FOPENMAX อย่างน้อยหนึ่งไฟล์ที่เปิดพร้อมกัน พารามิเตอร์ชื่อไฟล์ C สตริงที่มีชื่อของไฟล์ที่จะเปิด ค่าดังกล่าวจะต้องเป็นไปตามข้อกำหนดของชื่อไฟล์ของสภาพแวดล้อมที่ใช้งานและอาจรวมถึงเส้นทาง (หากได้รับการสนับสนุนโดยระบบ) โหมด C ที่มีโหมดการเข้าถึงไฟล์ สามารถ: อ่าน: เปิดไฟล์สำหรับการดำเนินการป้อนข้อมูล ไฟล์ต้องมีอยู่ เขียน: สร้างไฟล์ว่างสำหรับการดำเนินการออก หากไฟล์ที่มีชื่อเดียวกันมีอยู่แล้วเนื้อหาจะถูกยกเลิกและไฟล์จะถือว่าเป็นไฟล์ว่างเปล่าใหม่ ผนวก: เปิดไฟล์สำหรับเอาต์พุตที่ท้ายไฟล์ การดำเนินการออกเสมอเขียนข้อมูลที่ท้ายแฟ้มขยาย การดำเนินการจัดตำแหน่ง (fseek. fsetpos. rewind) จะถูกละเว้น แฟ้มถูกสร้างขึ้นหากไม่มีอยู่ readupdate: เปิดไฟล์สำหรับอัพเดต (ทั้งสำหรับอินพุตและเอาต์พุต) ไฟล์ต้องมีอยู่ writeupdate: สร้างไฟล์ว่างเปล่าและเปิดขึ้นเพื่ออัพเดต (ทั้งสำหรับอินพุตและเอาต์พุต) หากไฟล์ที่มีชื่อเดียวกันมีอยู่แล้วเนื้อหาจะถูกยกเลิกและไฟล์จะถือว่าเป็นไฟล์ว่างเปล่าใหม่ appendupdate: เปิดไฟล์สำหรับอัพเดต (ทั้งสำหรับอินพุตและเอาต์พุต) พร้อมกับการดำเนินการออกทั้งหมดที่เขียนข้อมูลในตอนท้ายของไฟล์ การดำเนินการจัดตำแหน่ง (fseek. fsetpos. rewind) มีผลต่อการดำเนินการป้อนข้อมูลครั้งต่อไป แต่การดำเนินการส่งออกจะเลื่อนตำแหน่งกลับไปที่จุดสิ้นสุดของไฟล์ แฟ้มถูกสร้างขึ้นหากไม่มีอยู่ กับ specifiers โหมดเหนือไฟล์จะเปิดเป็นไฟล์ข้อความ ในการเปิดไฟล์เป็นไฟล์ไบนารี ต้องมีอักขระ b เข้าไปในสตริงโหมด ตัวอักษร b เพิ่มเติมนี้สามารถถูกผนวกเข้าไว้ในตอนท้ายของสตริง (เช่นทำให้โหมดผสมต่อไปนี้: rb, wb, ab, rb, wb, ab) หรือแทรกระหว่างตัวอักษรและเครื่องหมายสำหรับโหมดผสม (rb, wb, ab) มาตรฐาน C ใหม่ (C2011 ซึ่งไม่ใช่ส่วนของ C) จะเพิ่มตัวย่อยย่อยมาตรฐานใหม่ (x) ซึ่งสามารถผนวกเข้ากับตัวระบุ w (เพื่อสร้าง wx wbx. wx หรือ wbxwbx) ตัวแบ่งย่อยนี้บังคับให้ฟังก์ชันล้มเหลวหากมีไฟล์อยู่แทนการเขียนทับ หากมีอักขระเพิ่มเติมตามลำดับการทำงานขึ้นอยู่กับการใช้ไลบรารี: การใช้งานบางอย่างอาจไม่สนใจอักขระอื่น ๆ เพื่อให้ตัวอย่างเช่นมีการเพิ่ม t (บางครั้งใช้เพื่อระบุไฟล์อย่างชัดเจน) ในการใช้งานไลบรารีบางอย่างการเปิดหรือสร้างไฟล์ข้อความที่มีโหมดอัพเดตอาจถือว่าสตรีมแทนเป็นไฟล์ไบนารี ไฟล์ข้อความคือไฟล์ที่มีลำดับของบรรทัดข้อความ การแปลงอักขระพิเศษบางอย่างอาจเกิดขึ้นในการดำเนินการอินพุตเอาต์พุตในโหมดข้อความเพื่อปรับให้เข้ากับรูปแบบไฟล์ข้อความเฉพาะระบบทั้งนี้ขึ้นอยู่กับสภาพแวดล้อมที่แอ็พพลิเคชันทำงาน แม้ว่าในสภาพแวดล้อมบางอย่างจะไม่มีการแปลงเกิดขึ้นทั้งไฟล์ข้อความและไฟล์ไบนารีจะได้รับการปฏิบัติแบบเดียวกันการใช้โหมดที่เหมาะสมช่วยเพิ่มความสามารถในการพกพา สำหรับไฟล์ที่เปิดอยู่สำหรับการอัพเดท (ซึ่งมีเครื่องหมาย) ซึ่งสามารถใช้งานได้ทั้งแบบอินพุตและเอาต์พุตสตรีมจะต้องล้างข้อมูล (fflush) หรือเปลี่ยนตำแหน่ง (fseek. fsetpos rewind) ก่อนการอ่านที่เกิดขึ้นหลังจากการเขียน จะต้องมีการปรับตำแหน่งสตรีม (fseek. fsetpos. rewind) ก่อนดำเนินการเขียนตามการอ่าน (เมื่อใดก็ตามที่การดำเนินการไม่ถึงจุดจบของไฟล์) ค่าที่ส่งกลับถ้าแฟ้มถูกเปิดสำเร็จฟังก์ชันจะส่งกลับตัวชี้ไปยังวัตถุ FILE ที่สามารถใช้เพื่อระบุกระแสข้อมูลสำหรับการดำเนินการในอนาคต มิฉะนั้นจะมีการส่งคืนตัวชี้ค่า null ในการใช้งานห้องสมุดส่วนใหญ่ตัวแปร errno จะถูกตั้งค่าเป็นรหัสข้อผิดพลาดเฉพาะระบบเมื่อความล้มเหลวคำตอบง่ายๆคือไม่ โหมดนี้จะถูกกำหนดเมื่อมีการสร้างอ็อบเจ็กต์ iostream และไม่สามารถเปลี่ยนแปลงได้ในภายหลัง การใช้งานบางอย่างอาจให้วิธีการทำในภายหลัง แต่นี่ไม่ใช่มาตรฐาน ในการใช้งานบางอย่างการทำ freopen บน stdout อาจเปลี่ยนโหมดแม้ว่าฉันคิดว่าอย่างเป็นทางการนี้เป็นสิ่งต้องห้ามใน C. (เป็นการใช้งานที่กำหนดไว้ใน C. ) และเห็นได้ชัดว่ามันไม่ได้ทำงานในการใช้งานของคุณ ทางออกที่ดีที่สุดคือการหาวิธีตั้งชื่ออุปกรณ์คอนโซล (devtty ภายใต้ Unix CONS ฉันคิดว่าภายใต้ Windows) เปิดในโหมดที่ต้องการและส่งออกไป ตอบ 16 เม. ย. 14 ที่ 11: 34freopen (3) - หน้า Linux man fopen, fdopen, freopen-stream functions เปิดคุณลักษณะการทดสอบความต้องการมาโครสำหรับ glibc (ดู featuretestmacros (7)): fdopen (): POSIXCSOURCE gt 1 XOPENSOURCE POSIXSOURCE คำอธิบาย fopen () จะเปิดไฟล์ที่มีชื่อเป็นสตริงที่ชี้ไปตามเส้นทางและเชื่อมโยงสตรีมด้วย โหมดอาร์กิวเมนต์ชี้ไปที่สตริงที่ขึ้นต้นด้วยหนึ่งในลำดับต่อไปนี้ (อาจตามด้วยอักขระเพิ่มเติมตามที่อธิบายไว้ด้านล่าง): r เปิดไฟล์ข้อความสำหรับอ่าน สตรีมอยู่ในตำแหน่งที่จุดเริ่มต้นของไฟล์ เปิดอ่านและเขียน สตรีมอยู่ในตำแหน่งที่จุดเริ่มต้นของไฟล์ ตัดทอนไฟล์เป็นศูนย์หรือสร้างไฟล์ข้อความสำหรับเขียน สตรีมอยู่ในตำแหน่งที่จุดเริ่มต้นของไฟล์ เปิดอ่านและเขียน ไฟล์ถูกสร้างขึ้นหากไม่มีอยู่มิฉะนั้นจะถูกตัดทอน สตรีมอยู่ในตำแหน่งที่จุดเริ่มต้นของไฟล์ เปิดเพื่อผนวก (เขียนตอนท้ายไฟล์) แฟ้มถูกสร้างขึ้นหากไม่มีอยู่ สตรีมอยู่ที่ตำแหน่งท้ายไฟล์ เปิดอ่านและผนวก (เขียนตอนท้ายไฟล์) แฟ้มถูกสร้างขึ้นหากไม่มีอยู่ ตำแหน่งไฟล์เริ่มต้นสำหรับการอ่านอยู่ที่ตำแหน่งเริ่มต้นของไฟล์ แต่จะมีการเพิ่มเอาต์พุตไปที่ส่วนท้ายของไฟล์เสมอ สตริงโหมดอาจประกอบด้วยตัวอักษร b เป็นอักขระตัวสุดท้ายหรือเป็นอักขระระหว่างอักขระในสตริงอักขระสองตัวที่อธิบายไว้ข้างต้น นี้เป็นอย่างเคร่งครัดสำหรับความเข้ากันได้กับ C89 และไม่มีผล b จะถูกละเว้นในทุกระบบสอดคล้อง POSIX รวมทั้ง Linux (ระบบอื่นอาจรักษาไฟล์ข้อความและไฟล์ไบนารีได้แตกต่างกันและการเพิ่มขอาจเป็นความคิดที่ดีถ้าคุณทำ IO กับไฟล์ไบนารีและคาดหวังว่าโปรแกรมของคุณอาจถูกย้ายไปอยู่ในสภาพแวดล้อมที่ไม่ใช่ UNIX) ดูหมายเหตุด้านล่างสำหรับรายละเอียดของ ส่วนขยาย glibc สำหรับโหมด ไฟล์ใด ๆ ที่สร้างขึ้นจะมีโหมด SIRUSR SIWUSR SIRGRP SIGRP SIROTH SIWOTH (0666) ซึ่งแก้ไขโดยใช้กระบวนการ umask value (ดู umask (2)) การอ่านและการเขียนอาจถูกผสมกันระหว่างกระแสข้อมูล readwrite ในลำดับใดก็ได้ โปรดทราบว่า ANSI C กำหนดให้ฟังก์ชันการกำหนดตำแหน่งแฟ้มแทรกแซงระหว่างเอาต์พุตและอินพุตเว้นแต่ว่าการดำเนินการป้อนข้อมูลพบจุดจบของไฟล์ (ถ้าเงื่อนไขนี้ไม่เป็นไปตามนั้นการอ่านจะได้รับอนุญาตให้ส่งกลับผลการเขียนอื่นที่ไม่ใช่ล่าสุด) ดังนั้นจึงเป็นการดี (และบางครั้งก็จำเป็นต้องใช้ภายใต้ Linux) เพื่อใส่ fseek (3) หรือ fgetpos (3 ) ระหว่างการเขียนและอ่านข้อมูลบนสตรีมดังกล่าว การดำเนินการนี้อาจเห็นได้ชัดว่าไม่มี op (เช่นใน fseek (. 0L, SEEKCUR) เรียกใช้สำหรับผลกระทบด้านการซิงโครไนซ์การเปิดไฟล์ในโหมดต่อท้าย (a เป็นตัวอักษรตัวแรกของโหมด) จะทำให้การดำเนินการเขียนทั้งหมดในภายหลังไปใช้กับสตรีมนี้ เกิดขึ้นที่ท้ายแฟ้มเช่นถ้ามีการโทรก่อนหน้านี้: ฟังก์ชัน fdopen () เชื่อมโยงสตรีมกับไฟล์อธิบายที่มีอยู่ fd โหมดของสตรีม (หนึ่งในค่า r, r, w, w, a, a) ต้องเข้ากันได้กับโหมดของ descriptor ไฟล์ตัวบ่งชี้ตำแหน่งไฟล์ของสตรีมใหม่จะถูกตั้งค่าเป็นของ fd และตัวบ่งชี้ข้อผิดพลาดและตัวบ่งชี้ที่สิ้นสุดของแฟ้มจะถูกลบออกโหมด w หรือ w ไม่ทำให้เกิดการตัดทอน ของไฟล์ descriptor ไฟล์ไม่ติดกับดักและจะถูกปิดเมื่อสตรีมที่สร้างขึ้นโดย fdopen () จะถูกปิดผลลัพธ์ของการใช้ fdopen () กับอ็อบเจ็กต์หน่วยความจำที่ใช้ร่วมกันจะไม่ได้กำหนดไว้ฟังก์ชัน freopen () จะเปิดไฟล์ที่มี ชื่อคือสตริงที่ชี้ไปตามเส้นทางและเชื่อมโยงสตรีมที่ชี้ไปตามสตรีมด้วยสตรีมต้นฉบับ (ถ้ามี) มีอยู่) ถูกปิด ใช้อาร์กิวเมนต์โหมดเช่นเดียวกับฟังก์ชัน fopen () การใช้ฟังก์ชัน freopen () หลักคือการเปลี่ยนไฟล์ที่เกี่ยวข้องกับกระแสข้อมูลมาตรฐาน (stderr. stdin หรือ stdout) ค่าที่ส่งกลับเมื่อสำเร็จ fopen (), fdopen () และ freopen () ส่งกลับ FILE pointer มิเช่นนั้น NULL จะถูกส่งกลับและ errno ถูกตั้งค่าเพื่อแสดงข้อผิดพลาด โหมดที่ให้มากับ fopen (), fdopen () หรือ freopen () ไม่ถูกต้อง ฟังก์ชั่น fopen (), fdopen () และ freopen () อาจล้มเหลวและตั้งค่า errno สำหรับข้อผิดพลาดที่ระบุไว้สำหรับ malloc ประจำ (3) ฟังก์ชัน fopen () อาจล้มเหลวและตั้งค่า errno สำหรับข้อผิดพลาดที่ระบุไว้สำหรับงานประจำเปิด (2) ฟังก์ชัน fdopen () อาจล้มเหลวและตั้งค่า errno สำหรับข้อผิดพลาดที่ระบุไว้สำหรับ fcntl (2) ตามปกติ ฟังก์ชัน freopen () อาจล้มเหลวและตั้งค่า errno สำหรับข้อผิดพลาดที่ระบุไว้สำหรับขั้นตอนการเปิด (2), fclose (3) และ fflush (3) สอดคล้องกับฟังก์ชัน fopen () และ freopen () เป็นไปตาม C89 ฟังก์ชัน fdopen () สอดคล้องกับ POSIX.1-1990 Glibc notes ไลบรารี GNU C อนุญาตส่วนขยายต่อไปนี้สำหรับสตริงที่ระบุในโหมด c (ตั้งแต่ glibc 2.3.3) อย่าเปิดการดำเนินการหรือดำเนินการอ่านและเขียนในภายหลังหัวข้อการยกเลิกเธรด ธงนี้ถูกละเว้นสำหรับ fdopen () e (since glibc 2.7) เปิดไฟล์ที่มีธง OCLOEXEC ดูรายละเอียดเพิ่มเติมที่ open (2) ธงนี้ถูกละเว้นสำหรับ fdopen () m (since glibc 2.3) พยายามเข้าถึงไฟล์โดยใช้ mmap (2) แทนที่จะเรียกระบบ IO (อ่าน (2) เขียน (2)) ปัจจุบันใช้ mmap (2) สำหรับไฟล์ที่เปิดอ่านเท่านั้น x เปิดไฟล์โดยเฉพาะ (เช่นธง OEXCL ของ open (2)) หากไฟล์มีอยู่แล้ว fopen () ล้มเหลวและตั้งค่า errno เป็น EEXIST ธงนี้ถูกละเว้นสำหรับ fdopen () นอกเหนือจากตัวอักษรข้างต้นแล้ว fopen () และ freopen () สนับสนุนไวยากรณ์ต่อไปนี้ในโหมด สตริงที่ระบุจะถูกนำมาเป็นชื่อชุดอักขระที่เป็นรหัสและสตรีมจะถูกทำเครื่องหมายว่ากว้างขึ้น หลังจากนั้นฟังก์ชันการแปลงภายในแปลง IO เป็นและจากสตริงชุดอักขระ หากไม่ได้ระบุไวยากรณ์สาย CCS ไว้การกำหนดทิศทางในแนวกว้างของสตรีมจะพิจารณาจากการดำเนินการไฟล์ครั้งแรก หากการดำเนินการดังกล่าวเป็นลักษณะการทำงานแบบกว้าง ๆ สตรีมจะถูกทำเครื่องหมายว่ามีรูปแบบกว้างและมีการโหลดฟังก์ชันเพื่อแปลงเป็นชุดอักขระที่เข้ารหัส เมื่อแยกวิเคราะห์อักขระแฟล็กแต่ละตัวในโหมด (เช่นอักขระที่ระบุข้อกำหนดของ CCS) การใช้ glibc ของ fopen () และ freopen () จำกัด จำนวนอักขระที่ตรวจสอบในโหมดเป็น 7 (หรือในเวอร์ชัน glibc ก่อนหน้า 2.14 ถึง 6 ซึ่งไม่เพียงพอที่จะรวมข้อกำหนดที่เป็นไปได้เช่น rbcmxe) การใช้งาน fdopen () จะดำเนินการในโหมดนี้ไม่เกิน 5 อักขระ อ้างอิงโดย

No comments:

Post a Comment