01
של 08
דרך חדשה לתפוקה
C ++ שומר על תאימות גבוהה מאוד לאחור עם C, כך
בשיעור הקודם נגעו בזה באמצעות דוגמה שהשתמשה בקאוט. כאן ניכנס לעומק קצת יותר מתחיל עם הפלט תחילה שכן הוא נוטה לשמש יותר מאשר קלט.
מחלקת iostream מספקת גישה לאובייקטים ולשיטות הדרושים לך הן לפלט והן לקלט. חשוב על קלט / פלט במונחים של זרמי בתים - בין היישום שלך לקובץ, למסך או למדפסת - זה פלט או מהמקלדת - זה קלט.
פלט עם קוט
אם אתה מכיר את C, אולי אתה יודע זאת << משמש להעברת חלקים שמאלה. למשל 3 << 3 הוא 24. למשל משמרת שמאלית מכפילה את הערך כך ש -3 משמרות שמאל מכפילות את זה ב -8.
ב- C ++, << היה עמוס יתר בכיתת הזרם כך int, לצוף, וסוגי מיתרים (והגרסאות שלהם - למשל מכפיל) נתמכים כולם. כך מבצעים פלט טקסט על ידי מיתר פריטים מרובים בין <<.>
cout << "קצת טקסט" << אינטל
תחביר משונה זה אפשרי מכיוון שכל אחד מ << היא למעשה שיחת פונקציה שמחזירה a התייחסות לזרם חפץ. אז קו כמו האמור לעיל הוא למעשה כזה
cout. << ("קצת טקסט"). cout. << (אינטל '). cout. << (floatdouble). cout. << (endl);
ג פונקציהprintf היה מסוגל לעצב פלט באמצעות מפרט תבניות כגון% d. ב- C ++ cout יכול גם לעצב את הפלט אך משתמש בדרך אחרת לעשות זאת.
02
של 08
באמצעות Cout כדי לעצב את הפלט
חפץ החפץ הוא חבר ב- זרם ספריה. זכור כי יש לכלול זאת באמצעות א
# כלול
הספרייה הזו זרם נגזר זרם (לפלט) ו- istream לקלט.
עיצוב של פלט טקסט נעשה על ידי הכנסת מניפולטורים לזרם הפלט.
מהו מניפולטור?
זוהי פונקציה שיכולה לשנות את המאפיינים של זרם הפלט (והקלט). בעמוד הקודם ראינו את זה << הייתה פונקציה עמוסה שהחזירה הפניה לאובייקט המתקשר, למשל cout לפלט או cin לכניסה. כל המניפולטורים עושים זאת כדי שתוכל לכלול אותם בפלט << או קלט >>. אנו נסתכל על קלט ו >> בהמשך בשיעור זה.
לספור << endl;
endl הוא מניפולטור שמסיים את הקו (ומתחיל קו חדש). זוהי פונקציה שאפשר לקרוא לה גם בדרך זו.
endl (cout);
אם כי בפועל לא היית עושה את זה. אתה משתמש בזה ככה.
cout << "קצת טקסט" << endl << endl; // שני שורות ריקות.
קבצים הם רק זרמים
משהו שכדאי לזכור שעם התפתחות רבה בימים אלה נעשה ממשק משתמש יישומים, מדוע תזדקק לפונקציות קלט / פלט של טקסט? זה לא רק בשביל קונסולה יישומים? ובכן סביר להניח שתעשו קלט / פלט של קבצים ותוכלו להשתמש בהם גם שם אבל גם מה שמוצא למסך לרוב צריך גם עיצוב. זרמים הם דרך גמישה מאוד להתמודד עם קלט ופלט ויכולים לעבוד איתם
- קלט / פלט של טקסט. כמו ביישומי קונסולה.
- מיתרים. שימושי לעיצוב.
- קלט / פלט של הקובץ.
מניפולטורים שוב
למרות שהשתמשנו ב- זרם כיתה, זה א כיתה נגזרת מ ה ios שיעור שמקורו ב בסיס ios_. מעמד אבות זה מגדיר את הציבור פונקציות שהם מניפולציות.
03
של 08
רשימת מניפולטורים
ניתן להגדיר מניפולציות בזרמי קלט או פלט. אלה אובייקטים שמחזירים הפניה לאובייקט וממקמים בין זוגות של <<. רוב המניפולציות מוכרזות ב, אבל endl, מסתיים ו סומק בא מ
להלן רשימה מפורטת יותר.
מ
- endl - מסיים את הקו והשיחות במהירות.
- מסתיים - מוסיף '\ 0' ( ריק) לתוך הנחל.
- סומק - אילץ את המאגר שיוצא מיידית.
מ . רובם מוכרזים ב-
- boolalpha - הכנס או הוצא אובייקטים של bool כ- "true" או "false".
- noboolalpha - הכנס או הוצא אובייקטים של bool כערכים מספריים.
- קבוע - הוסף ערכי נקודה צפה בפורמט קבוע.
- מדעי - הכנס ערכי נקודה צפה בפורמט מדעי.
- פנימי - הצדקה פנימית.
- שמאל - שמאל-הצדקה.
- ימינה - הצדקה ימנית.
- dec - הכנס או חילץ ערכים שלמים בפורמט עשרוני.
- hex - הכנס או הוצא ערכים שלמים בפורמט הקסדצימאלי (בסיס 16).
- oct - הכנס או מחלץ ערכים בתבנית אוקטלית (בסיס 8).
- בסיס noshow - אל תקדימו ערך עם בסיסו.
- showbase - ערך קידומת עם בסיסו.
- נקודת noshowpoint - אל תציג נקודה עשרונית במידת הצורך.
- נקודת תצוגה - הצג תמיד נקודה עשרונית בעת הכנסת ערכי נקודה צפה.
- noshowpos - אל תוסיף סימן פלוס (+) אם המספר> = 0.
- showpos - האם להוסיף סימן פלוס (+) אם המספר> = 0.
- noskipws - אל תדלג על שטח לבן ראשוני בעת החילוץ.
- skipws - דלג על שטח לבן ראשוני בעת חילוץ.
- nouppercase - אל תחליף אותיות קטנות בשווי אותיות גדולות.
- אותיות גדולות - החלף אותיות קטנות באותיות גדולות.
- unitbuf - חיץ סומק לאחר הכנסה.
- nounitbuf - אל תשטפו את המאגר אחרי כל הכנסה.
04
של 08
דוגמאות לשימוש בקאוט
// ex2_2cpp. # כלול "stdafx.h" # כלולשימוש במרחב השמות std; int main (int argc, char * argv []) { cout.width (10); cout << מימין << "מבחן" << endl; cout << עזב << "מבחן 2" << endl; cout << פנימי << "מבחן 3" << endl; cout << endl; דיוק (2); cout << 45.678 << endl; cout << אותיות גדולות << "David" << endl; דיוק (8); cout << מדעי << endl; cout << 450678762345.123 << endl; cout << קבוע << endl; cout << 450678762345.123 << endl; cout << showbase << endl; cout << showpos << endl; cout << hex << endl; cout << 1234 << endl; cout << oct << endl; cout << 1234 << endl; cout << דצמבר << endl; cout << 1234 << endl; cout << noshowbase << endl; cout << noshowpos << endl; cout.unsetf (ios:: אותיות גדולות); cout << hex << endl; cout << 1234 << endl; cout << oct << endl; cout << 1234 << endl; cout << דצמבר << endl; cout << 1234 << endl; להחזיר 0; }
הפלט מזה הוא למטה, כאשר רווח קו נוסף נוסף או שניים הוסרו לשם הבהרה.
מבחן. מבחן 2. מבחן 3. 46. דייויד. 4.50678762E + 011. 450678762345.12299000. 0X4D2. 02322. +1234. 4d2. 2322. 1234.
הערה: למרות האותיות הגדולות, דויד מודפס כדוד ולא כדויד. הסיבה לכך היא שאותן אותיות גדולות משפיעות רק על הפלט שנוצר - למשל מספרים מודפסים הקסדצימלי. אז פלט ה- Hex 4d2 הוא 4D2 כאשר האותיות הגדולות פועלות.
כמו כן, רוב המניפולטורים הללו למעשה מציבים קצת בדגל וניתן להגדיר זאת ישירות עם
cout.setf ()
ולנקות את זה עם
cout.unsetf ()
05
של 08
שימוש ב- Setf וב- Unsetf כדי לטפל בעיצוב קלט / פלט
הפונקציה setf יש שניים עמוס יתר גרסאות המוצגות להלן. בזמן unsetf רק מנקה את הקטעים שצוינו.
setf (ערכי דגל); setf (ערכי דגל, מסכי שווי); unsetf (ערכי דגל);
הדגלים המשתנים נגזרים על ידי אורינג יחד את כל הקטעים שאתה רוצה איתם | אז אם אתה רוצה מדעי, אותיות גדולות ובוללפות ואז השתמש בזה. רק החלקים עברו כמו פרמטר מוכנים. שאר הקטעים נותרים ללא שינוי.
cout.setf (ios_base:: מדעי | ios_base:: אותיות גדולות | ios_base:: boolalpha); cout << hex << endl; cout << 1234 << endl; cout << דצמבר << endl; cout << 123400003744.98765 << endl; ערך bool = נכון; cout << ערך << endl; cout.unsetf (ios_base:: boolalpha); cout << ערך << endl;
מפיקה
4D2. 1.234000E + 011. נכון. 1.
חתיכות מיסוך
השניים פרמטר גרסת setf משתמשת במסיכה. אם הסיב מוגדר בפרמטרים הראשונים והשניים אז הוא מוגדר. אם הסיבית נמצאת רק בפרמטר השני אז הוא מנוקה. הערכים אדפילד, שדה בסיס ו שדה צף (מופיעים בהמשך) הם דגלים מורכבים, כלומר מספר דגלים או יחד. ל שדה בסיס עם הערכים 0x0e00 זהה ל דצמבר | אוקט | hex. כך
setf (ios_base:: hex, ios_basefield);
מנקה את שלושת הדגלים ואז קובע hex. באופן דומה אדפילפילד הוא שמאל | צודק | פנימי ו שדה צף הוא מדעי | תוקן.
רשימת ביטים
רשימת האינומים נלקחה מ- Microsoft Visual C ++ 6.0. הערכים בפועל המשמשים שרירותיים - מהדר אחר עשוי להשתמש בערכים שונים.
skipws = 0x0001. unitbuf = 0x0002. אותיות גדולות = 0x0004. בסיס ראווה = 0x0008. נקודת תצוגה = 0x0010. showpos = 0x0020. שמאל = 0x0040. מימין = 0x0080. פנימי = 0x0100. דצמבר = 0x0200. אוקט = 0x0400. hex = 0x0800. מדעי = 0x1000. קבוע = 0x2000. boolalpha = 0x4000. התאמת שדה = 0x01c0. שדה בסיס = 0x0e00, floatfield = 0x3000. _Fmtmask = 0x7fff, _Fmtzero = 0.
06
של 08
אודות Clog and Cerr
כמו קוט, סתום ו cerr הם אובייקטים מוגדרים מראש המוגדרים במעלה הזרם. המעמד הזרם יורש משניהם זרם ו istream אז בגלל זה קוט דוגמאות יכולות להשתמש זרם.
חוצץ ולא שקוע
- Buffered - כל הפלט נשמר באופן זמני ב- חיץ ואז הושלכה למסך בהפעלה אחת. גם קוט וגם סתום חוצצים.
- Unpuffed - כל הפלט יעבור מיד למכשיר הפלט. דוגמה לאובייקט לא מגושם היא cerr.
הדוגמה להלן מדגימה כי cerr משמש באותו אופן כמו קוט.
# כלול שימוש במרחב השמות std; int _tmain (int argc, _TCHAR * argv []) {cerr.width (15); cerr.right; cerr << "שגיאה" << endl; להחזיר 0; }
הבעיה העיקרית עם חציצה היא אם תכנית מתרסק ואז תוכן המאגר הולך לאיבוד וקשה יותר לראות מדוע הוא התרסק. הפלט ללא התפשטות הוא מיידי, כך שפיזור של כמה שורות כאלה בקוד עשוי להועיל.
cerr << "כניסה לפונקציה מסוכנת zappit" << endl;
בעיית הרישום
בניית יומן של אירועי תוכנית יכולה להיות דרך שימושית לאתר באגים קשים - מהסוג שמתרחש רק מדי פעם. אם האירוע הזה הוא קריסה, יש לך את הבעיה - האם אתה משטף את היומן לדיסק אחרי כל שיחה כדי שתוכל לראות אירועים ממש עד ההתרסקות או שמור אותו במאגר ושטף מעת לעת את המאגר ומקווה שלא תאבד יותר מדי כשההתרסקות מתרחש?
07
של 08
שימוש בסינק לקלט: קלט מעוצב
ישנם שני סוגים של קלט.
- מעוצב. קריאת קלט כמספרים או מסוג מסוים.
- לא מעוצב. קריאת בתים או מיתרים. זה נותן שליטה הרבה יותר גדולה על זרם הקלט.
להלן דוגמה פשוטה לקלט מעוצב.
// excin_1.cpp: מגדיר את נקודת הכניסה ליישום המסוף. # כלול "stdafx.h" // מיקרוסופט בלבד. # כלול שימוש במרחב השמות std; int main (int argc, char * argv []) { int a = 0; לצוף b = 0.0; int c = 0; cout << "אנא הזן int, float ו- int מופרדים על ידי רווחים" <> a >> b >> c; cout << "הזנת" << a << "" << b << "" << c << endl; להחזיר 0; }
זה משתמש בסינק כדי לקרוא שלושה מספרים (int, לצוף, int) מופרדים על ידי רווחים. עליך להקיש על Enter לאחר הקלדת המספר.
3 7.2 3 תפלט "הזנת 3 7.2 3".
לקלט המעוצב יש מגבלות!
אם אתה מזין 3.76 5 8, תקבל "הזנת 3 0.76 5", כל שאר הערכים באותו קו אבודים. זה מתנהג כמו שצריך. אינו חלק מהאינטרנט ולכן מסמן את תחילת הציפה.
שגיאה בלכידה
האובייקט cin מגדיר מעט כשל אם הקלט לא הומר בהצלחה. הקטע הזה הוא חלק ממנו ios וניתן לקרוא אותם באמצעות להיכשל () פונקציה על שניהם סנטר ו קוט ככה.
אם (cin.fail ()) // תעשה משהו.
לא מפתיע, cout.fail () לעתים רחוקות מוגדר, לפחות על פלט המסך. בשיעור מאוחר יותר בקובץ קלט / פלט, נראה איך cout.fail () יכול להיות אמיתי. יש גם טוב () פונקציה עבור סנטר, קוט וכו '