[Powered by Google Translate] טומי: בסרטון הזה, אנו לומדים על
הפניית וצינורות.
עד כה, יש כבר משתמשות בפונקציות כמו printf כדי
נתוני פלט למסוף ופונקציות כמו GetString
כדי לאפשר למשתמש לספק הקלט ל
תכנית שימוש במקלדת.
בואו נעיף מבט מהיר בתכנית שמקבלת שורה של
קלט מהמשתמש ולאחר מכן פלטיו.
>> ביום 7 בשורה, אנחנו מעודדים את המשתמש למחרוזת, ו
אז בשורה 8, אנחנו מדפיסים אותו בחזרה החוצה.
בואו לקמפל ולהריץ את התכנית שלנו.
גדול.
המחרוזת ספקנו הדהדה בחזרה
לנו במסוף.
זה קרה משום שפונקצית printf כתבה לי
זרם קרא סטנדרטי, או S-t-d-out.
כאשר משהו כתוב ל stdout, זה כברירת מחדל
מוצג על ידי המסוף.
>> אז זה טוב ויפה, אבל מה אם, במקום פשוט
הצגת המחרוזת, רציתי לשמור אותו לקובץ?
לדוגמה, יתכן שעלינו לזכור מה בדיוק
תכנית הייתי כשנתנו לו קלט מסוים מאוחר יותר.
גישה אחת תהיה לעשות את זה בתכנית C שלנו, באמצעות
כמה פונקציות מיוחדות לכתיבה לקבצים שעוד
לראות בוידאו אחר.
אפילו קל יותר, אם כי, יהיה איכשהו
להפנות stdout לקובץ.
בדרך זו, כאשר כותב printf ל stdout, תוכן
ייכתב לקובץ ולא
מוצג על ידי המסוף.
אנחנו יכולים לעשות בדיוק את זה על ידי הוספת סימן גדול מ, ואחרי
לפי שם קובץ, לפקודתו אנו משתמשים כדי לבצע את התכנית שלנו.
>> אז, ולא רק ביצוע. / להפנות, אנחנו יכולים
לרוץ. / לנתב, ואחרי יותר מסימן, ואחריו
שם קובץ, כמו file.txt.
בואו לראות מה קורה.
אישור.
שים לב, זה זמן, שום דבר לא מוצג במסוף,
אבל אנחנו לא שינינו את התוכן שלנו
תכנית C בכלל.
עכשיו בואו נבחן את התוכן של מדריך זה עם LS.
>> בסדר.
עכשיו יש לנו קובץ חדש בספרייה שלנו נקרא file.txt,
שהוא שם הקובץ שספקנו כשרצנו
הפנית תכנית.
בואו לפתוח file.txt.
וכאן, אנו יכולים לראות כי stdout מתוך להפנות היה
כתב לקובץ שנקרא file.txt.
אז בואו להפעיל את הפקודה הקודמת שוב, אבל אספקה
קלט שונה הפעם.
אוקיי.
בואו נסתכל file.txt עכשיו.
>> אנחנו יכולים לראות כאן שהקובץ הוחלף, כך שלנו
קלט מקורי הוא כבר לא שם.
אם אנחנו רוצים במקום לצרף לקובץ זה, לשים חדש
הקלט להלן את התוכן הקיים של הקובץ, אנחנו יכולים
להשתמש בשני שלטים גדולים מ רק במקום אחד.
בואו ננסה את זה.
עכשיו, אם אנחנו פותחים file.txt שוב, אנחנו יכולים לראות גם משלנו
קווי הזנה.
במקרים מסוימים, יתכן שעלינו להניח כל
פלט של התכנית שלנו.
במקום לכתוב את הפלט לקובץ ולאחר מכן למחוק
קובץ כאשר אנחנו עושים עם זה, אנחנו יכולים לכתוב למיוחדים
קובץ בשם / dev / null.
כאשר משהו כתוב ל/ dev/null--
או סתם devnull בקיצור -
הוא מושלך באופן אוטומטי.
אז תחשוב devnull כחור שחור עבור הנתונים שלך.
>> אז עכשיו אנו רואים כיצד יותר מאשר הסימן יכול להפנות
stdout, בואו לראות איך אנו יכולים להפנות סטנדרטיים ב--
או s-t-d-ב--
האנלוגי של stdout.
בעוד פונקציות כמו printf לכתוב לנחל בשם
stdout, GetString ופונקציות דומות לקרוא מהזרם
נקרא stdin, אשר, כברירת מחדל, הוא הזרם של
תווים מוקלדים במקלדת.
אנו יכולים להפנות stdin שימוש פחות מסימן, ואחרי
לפי שם קובץ.
עכשיו, במקום לשאול את המשתמש עבור קלט ב
מסוף, תכנית יפתח את הקובץ שצוינו ולהשתמש
הקווים שלה כקלט.
>> בואו לראות מה קורה.
גדול.
השורה הראשונה של file.txt כבר מודפסת לטרמינל
בגלל שאנחנו קוראים GetString פעם אחת.
אם היו לנו שיחה נוספת לGetString בתכנית שלנו,
השורה הבאה של file.txt הייתה לשמש
קלט לאותה קריאה.
שוב, יש לנו לא שונה תכנית C שלנו בכלל.
אנחנו רק שינוי אופן בו אנו מפעילים אותו.
וגם לזכור, שלא יופנו stdout הזמן הזה,
לכן הפלט של התכנית היה עדיין
מוצג במסוף.
אנחנו יכולים, כמובן, להפנות גם stdin
וstdout כזה.
עכשיו, file2.txt מכיל את השורה הראשונה של file.txt.
>> לכן, שימוש באופרטורים אלה, אנחנו כבר יכולים לקרוא ו
לכתוב מקבצי טקסט.
עכשיו, בואו לראות איך אנחנו יכולים להשתמש בפלט של תכנית אחת כ
הקלט לתכנית אחרת.
אז הנה תכנית C פשוטה אחרת אני
כאן קרא hello.c.
כפי שאתה יכול לראות, זה פשוט פלטים "היי
יש! "למשתמש.
אם אני רוצה להפנות לשימוש כקלט הפלט של שלום -
תכנית אחרת -
אני יכול להפנות את stdout של שלום ראשון לקובץ שנקרא
input.txt, אז להפנות stdin של הפניה לאותו
קובץ - input.txt.
אז אני יכול לעשות. / שלום> input.txt.
לחץ על Enter כדי לבצע את זה.
ואחרי. / להפנות <
input.txt, ולבצע את זה.
אז אנחנו יכולים לקצר את זה קצת בנקודת פסיק, המאפשר
להפעילנו שתי פקודות או יותר על אותו הקו.
אז אני יכול לומר,. / שלום> input.txt, פסיק,
. / להפנות <input.txt.
>> אז זה עובד, אבל זה עדיין מרגיש די אלגנטי.
אני מתכוון, האם אנחנו באמת זקוקים לקובץ הטקסט הזה המתווך זה
אין עוד צורך בריצות אחרי ההפניה?
למזלנו, אנו יכולים להימנע מקובץ זה תוספת טקסט באמצעות מה
נקרא צינור.
אם אני אומר, / שלום |.. / להפנות, אז stdout של
התכנית בצד השמאל -
במקרה זה, הלו -
ישמש כקלט הסטנדרטי עבור
תכנית בצד ימין.
במקרה זה, לנתב מחדש. אז בואו נריץ את זה.
>> הנה.
אנחנו יכולים לראות שהפלט של שלום שמש כקלט
לחקירה חוזרת.
על ידי פקודות stringing יחד באמצעות צינורות, אנו יוצרים מה
נקרא צינור, מאז התפוקה שלנו היא בעצם להעביר
דרך רצף של פקודות.
שימוש בצינורות, אנחנו יכולים לעשות כמה דברים מגניבים, ללא צורך
כתיבת קוד בכלל.
לדוגמה, אניח שאנחנו רוצים לדעת כמה קבצים
בתוך ספרייה זו.
באמצעות צינור, אנחנו יכולים לשלב את פקודת ls עם ב"ש -
או ספירת מילים -
פקודה.
Ls יהיה פלט כל קובץ בספרייה ל stdout, ו
ב"ש תגיד לנו כמה שורות היו ניתן לה דרך stdin.
לכן, אם אנו אומרים ls | wc-l -
אספקה-l הדגל לב"ש לספר אותו לספור קווים -
אנחנו יכולים לראות בדיוק כמה קבצים
במדריך הנוכחי.
>> אז בואו נסתכל על דוגמה אחת יותר.
יש לי כאן קובץ שנקרא students.txt,
עם רשימה של שמות.
עם זאת, שמות אלה אינם בכל סדר כולו, וזה נראה
כמו כמה שמות חוזרים על עצמם.
מה שאנחנו רוצים הוא רשימה של שמות ייחודיים באלפביתי
סדר, נשמר בקובץ בשם final.txt.
אנחנו יכולים, כמובן, לכתוב תכנית C שתעשה זאת עבורנו.
אבל זה הולך להיות יותר שלא לצורך
מתחם די מהר.
בואו במקום להשתמש בצינורות וכמה-in-כלים שנבנו כדי לפתור
בעיה זו.
>> הדבר הראשון שאנחנו צריכים לעשות זה לקרוא את students.txt הקובץ.
פקודת החתול לעשות בדיוק את זה.
זה יהיה לקרוא בקובץ שצוין ולכתוב
התוכן שלה ל stdout.
אחרי שקראנו את קובץ הטקסט, אהיה
ברצונך למיין את השמות.
פקודת המין יכולה להתמודד עם זה בשבילנו.
מיינו יהיה פלט הקו מסופק דרך stdin ל stdout
כדי למיין.
על מנת לספק את התוכן לstudents.txt
stdin של המיון, אנחנו יכולים להשתמש בצינור לשלב חתול וסוג שהוא.
אז אני יכול לבצע חתול students.txt | מיון ו
לחץ על Enter.
ועכשיו, אנו רואים את התוכן בstudents.txt
בסדר אלפביתי.
>> אז בואו נוסיף פקודה אחרת -
uniq, או ייחודי -
לצינור שלנו.
כפי שאתם יכולים לנחש, uniq, כאשר ספק רצף ממוין של
קווים דרך stdin, יהיה פלט את הקווים הייחודיים.
אז עכשיו יש לנו החתול students.txt
| סוג | uniq.
לבסוף, אנו יכולים לחסוך את הפלט של הצינור
קובץ דרך החתול students.txt | סוג | uniq
> Final.txt.
לכן, אם אנחנו פותחים final.txt, יש לנו בדיוק את מה שהיינו
מחפש:
רשימה של שמות ייחודיים בסדר אלפביתי,
נשמר בקובץ טקסט.
דרך אגב, אנחנו גם יכולים לומר סוג <
students.txt | uniq> final.txt לעשות בדיוק
אותו הדבר, באמצעות כל אחד מהמפעילים שראינו ב
זה וידאו.
>> השמי הוא טומי, וזה CS50.