วิธีรับตัวชี้ FILE จาก File descriptor


86

ฉันกำลังเล่นอยู่mkstemp()ซึ่งให้คำอธิบายไฟล์ แต่ฉันต้องการสร้างเอาต์พุตที่จัดรูปแบบผ่านfprintf()ไฟล์. มีวิธีง่ายๆในการแปลง file descriptor ให้mkstemp()เป็นFILE *โครงสร้างที่เหมาะกับการใช้งานfprintf()หรือไม่?


คำตอบ:


103

ใช้fdopen():


34
และในการรับไฟล์อธิบายจาก FILE * ให้ใช้fileno(): linux.die.net/man/3/fileno
Lee Netherton

2
หากfdถูกเปิดด้วยแฟล็ก (เช่นO_NONBLOCK) - จะเกิดอะไรขึ้นกับพวกเขาหลังจากfdopenเปิดด้วยแฟล็กใหม่ พวกเขาจะxorรวมกันหรือเปลี่ยน?
xealits

5
@jww: ตัวอธิบายไฟล์ไม่ใช่ ANSI C ที่จะเริ่มต้นด้วย
Rufflewind

2
การโทรfdopenหลายครั้งมันไม่ดีหรือ? (สมมติว่ามันเกิดขึ้นในฟังก์ชันบางอย่างซึ่งถูกเรียกซ้ำแล้วซ้ำอีก)
phil294

2
@xealits ตัวเลือกสำหรับ FILE * ต้องอยู่ในขอบเขตของตัวอธิบายไฟล์ที่เปิดอยู่แล้ว ดังนั้นหากคุณเปิด fd ด้วยการอ่านอย่างเดียวและ FILE * ด้วยการเขียนเท่านั้นก็ควรมีข้อยกเว้น ดูข้อมูลเพิ่มเติมได้ที่ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/…
Tjad Clark

28

FILE* f = fdopen(d, "w");

man fdopen เอาท์พุท:

SYNOPSIS

ฟังก์ชั่นเชื่อมโยงกระแสกับอธิบายไฟล์ที่มีอยู่fdopen() fildesโหมดของสตรีมต้องเข้ากันได้กับโหมดของตัวอธิบายไฟล์ เมื่อกระแสถูกปิดผ่านfclose(3), fildesถูกปิดไปด้วย


1
ไม่มีใน ANSI C.
jww

ดูรายละเอียดเพิ่มเติมได้ที่ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/…
Tjad Clark

-8

ไม่มีวิธีมาตรฐานในการทำเช่นนี้ (หรือย้อนกลับ) เนื่องจาก C Standard ไม่มีอะไรจะพูดเกี่ยวกับตัวอธิบายไฟล์ แพลตฟอร์มเฉพาะของคุณอาจมีหรือไม่มีกลไกดังกล่าว


17
ขึ้นอยู่กับความหมายของ "มาตรฐาน" POSIX เป็นมาตรฐาน
Richard Pennington

12
คำถามเกี่ยวกับตัวอธิบายไฟล์ ;-)
Richard Pennington

11
@Neil> คำถามที่ถูกแท็กเป็น C ไม่ได้หมายความว่า "บอกความจริงเกี่ยวกับมาตรฐาน C ให้ฉันทราบ" แต่ "ฉันเขียนโค้ดเป็น C ฉันล้มเหลวในการทำสิ่งนี้โปรดบอกฉันว่าเป็นไปได้หรือไม่อย่างไร "
Gregory Pakosz

8
ฉันยอมรับว่าไม่มีวิธีมาตรฐานในการทำเช่นนี้ แต่การกล่าวถึงของ OP เป็นmkstempนัยว่าโซลูชันที่ไม่ได้มาตรฐานเป็นที่ยอมรับในกรณีนี้ อย่างไรก็ตามในกรณีนั้นเขาควรจะเพิ่มposixแท็ก (ซึ่งฉันเห็นว่ามีการเพิ่มแล้ว)
Emerick Rogul

9
@ นีลและจุดประสงค์ของเน็ตและความหมายของชีวิต คุณจะมีเหตุผลมากขึ้นถ้าคุณบอกว่าคุณมีความคิดเห็นที่แตกต่างกัน ฉันยังสงสัยว่า SO เป็นเรื่องเกี่ยวกับการแยกขนเกินมาตรฐาน และการพึ่งพาทักษะการแท็กของคนที่มีประสบการณ์ SO ตรงกับชื่อเสียงของ 23 ไม่เป็นประโยชน์
Michael Krelin - แฮ็กเกอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.