עבור לתוכן

פונקציית freopen - עזרה

Featured Replies

פורסם

שלום ,

אני רוצה לנתב את הפלט מהמסך לקובץ זאת בעזרת הפונקציה freopen , עכשיו לאחר הפעולה אני רוצה להחזיר שוב את הפלט למסך איך

בעצם זה מתבצע ? לא הצלחתי למצוא דוגמא רלוונטית , אשמח אם מישהו יוכל לעזור...

תודה

פורסם

לא מומלץ לעשות דברים כמו לנתב מחדש את הפלט, או לשחק עם stdin ו-stdout.

הנה רק כמה סיבות שחשבתי עליהם תוך דקה:

- איך אתה יודע ש-stdout זה בכלל המסך?

- אולי מישהו ניתב את הפלט לקובץ?

- אולי זה בכלל pipe או אפילו הפלט נותב בכלל ל-socket?

- האם הפלט הוא line buffered או לא?

- מה יקרה כאשר תעשה freopen? האם הצד השני עלול לקבל broken pipe?

בקיצור, אתה בטוח שזה מה שאתה רוצה לעשות? אני הייתי מנסה לחשוב שוב על הבעיה ולמצוא פתרון יותר טוב.

אבל בכל מקרה: http://wwwcgi.rdg.ac.uk:8081/cgi-bin/cgiwrap/wsi14/poplog/man/3C/freopen

http://www.cplusplus.com/freopen

עריכה:

השאלה עניינה אותי, אז חיטטתי קצת ברשת, והמסקנה שלי היא לחזור על ההמלצה: לא לעשות reopen ל-stdout.

הנה קצת מידע: http://c-faq.com/stdio/undofreopen.html

פורסם
  • מחבר

אני מדבר על C בסביבת יוניקס , הברירת מחדל של הSTDOUT היא אכן המסך , אני רוצה לשנות אותה בגדול per process

שמתי שאני ארצה אני פשוט אנתב אותה לקובץ ... (סטייל ניתוב לקובץ במעטפת ע"י <<)... האם אני צריך ליצור תהליך חדש בעזרת FORK ולבצע את זה שם כלומר

לבצע את השינוי בתהליך נפרד ולאחר סיום התהליך המצב יחזור לקדמותו או שיש דרך אחרת להחזיר את המצב לקדמותו בלי ליצור תהליך חדש, תודה

פורסם

טכניקה מקובלת אחת זה להשתמש ב-dup או dup2 ברמת ה-file descriptor, ולא דרך freopen.

עברו כמה שנים מאז שעשיתי את זה, אבל הרעיון הוא:


if ( fork() == 0 )
{
/* in child process */
(open output file and get its fd in out_fd)
close(1); /* 1 is stdout */
dup( out_fd ); /* dup will make sure that the newly released fd 1 will be chosen */
/* continue work, or do execp */
}

זה עלול להיות overkill אם אתה בסה"כ רוצה משהו פשוט. בד"כ עדיף פשוט לעבוד עם fprintf ולהפנות אותו לקובץ אחר בהתאם לצורך.

פורסם
  • מחבר

או קיי תודה אני אנסה את מה שהצעת...

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים