פונקציית Write() בשפת C

Pwnqzyyt Write Bspt C



ניהול קבצים בתכנות הוא משימה שהמתכנת חייב להיות שוטף בה. הכרת פונקציות הפתיחה, הקריאה והכתיבה השונות היא חיונית מכיוון שאנו תמיד צריכים אותן כדי לאחסן או להשליך את המידע המאוחסן בקבצים.

במאמר זה של Linux רמז, תלמד כיצד להשתמש בפונקציה write() כדי לכתוב את הקבצים.







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



לאחר מכן, אנו מיישמים את מה שלמדנו על ידי הכנסת השימוש בפונקציה זו לדוגמאות מעשיות שהכנו עבורך עם קטעי קוד ותמונות, המציגות את השימוש ב-write() בשפת C.



על מנת שיהיה לך ידע מקיף על השימוש בפונקציית write() הוספנו סעיף מיוחד המתאר את השגיאות הבודדות שעלולות להתרחש בעת שימוש בפונקציה זו, כמו גם איתור וזיהוי שלהן, כדי שיהיה לך טכניקות הכרחיות לפתרון מהיר במקרה של התרחשותן.





תחביר של הפונקציה Write() בשפת C

int לִכתוֹב ( int fd , בָּטֵל * buff , size_t נ ) ;

תיאור הפונקציה Write() בשפת C

הפונקציה write() כותבת לקובץ פתוח. פונקציה זו כותבת את תוכן המאגר שאליו מצביע 'buf' לקובץ שצוין על ידי המתאר שלו בארגומנט הקלט 'fd'. יש לציין את גודל הבלוק שייכתב לקובץ בארגומנט הקלט 'n'.

כדי להיות מסוגל לכתוב עם הפונקציה write() יש לפתוח את הקובץ עם הפונקציה open() ולציין בתכונות O_RDONLY או O_RDWR. אחרת, לפונקציה זו אין השפעה.



אם השיחה מצליחה, היא מחזירה את מספר התווים שהוזנו. אם מתרחשת שגיאה במהלך הכתיבה, היא מחזירה תוצאה ששווה ל-1. ניתן לאחזר את קוד הזיהוי המציין את השגיאה מהמשתנה הגלובלי errno המוגדר בכותרת 'errno.h'.

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

הפונקציה write() מוגדרת בכותרת 'unistd.h'. הדגלים המגדירים את התכונות והמצב לפתיחת הקובץ מוגדרים ב-'fcntl.h'. כדי להשתמש בפונקציות open() ו-write(), עליך לכלול את הכותרות האלה בקוד שלך באופן הבא:

#include

#include

כיצד לכתוב לקובץ באמצעות הפונקציה Write() בשפת C

בדוגמה זו, אנו כותבים קובץ טקסט ריק בשם 'example.txt' שיצרנו קודם לכן בספריית 'מסמכים'.

השלב הראשון הוא להכניס את הכותרות הדרושות. בתוך הפונקציה main() פתחו את הקובץ עם הפונקציה open(). לשם כך, עלינו להכריז על המספר השלם 'fd' המשמש כמתאר הקובץ, ואת מערך המאגר 'buf' בן 1024 התווים המכיל את הטקסט שאנו רוצים לכתוב לקובץ. במאגר זה, אנו מאחסנים את הפסקה הראשונה של דף האיש של GCC כדי לכתוב אותה לקובץ 'example.txt'.

לאחר פתיחת הקובץ עם הפונקציה open() במצב קריאה/כתיבה, אנו כותבים לקובץ על ידי קריאה לפונקציה write() והעברת מתאר הקובץ 'fd' כארגומנט הקלט הראשון, המצביע 'buf' בתור השני ארגומנט, וגודל המחרוזת הכלולה במערך כארגומנט השלישי, אותו אנו מקבלים עם הפונקציה strlen() . הנה הקוד לדוגמא זו:

#include

#include

#include

#include

#include

#include

#include

בָּטֵל רָאשִׁי ( )

{

int fd ;

לְהַשְׁחִיר בַּלָם [ 1024 ] = 'כשאתה מפעיל את GCC, זה בדרך כלל עושה עיבוד מקדים, קומפילציה, הרכבה וקישור. האפשרויות הכוללות מאפשרות לך לעצור את התהליך הזה בשלב ביניים. לדוגמה, האפשרות -c אומרת לא להפעיל את המקשר. ואז הפלט מורכב מ- פלט קבצי אובייקט על ידי האסמבלר.' ;

fd = לִפְתוֹחַ ( 'מסמכים/example.txt' , O_RDWR ) ;

לִכתוֹב ( fd , & בַּלָם , סטרלן ( בַּלָם ) ) ;

סגור ( fd ) ;

}

באיור הבא, אנו רואים את ההידור והביצוע של קוד זה יחד עם הקובץ שנפתח שנכתב על ידי הפונקציה write():

כיצד להוסיף טקסט בסוף קובץ עם הפונקציה Write() בשפת C

כאשר קובץ נפתח על ידי ציון הדגלים O_WRONLY או O_RDWR, הסמן קופץ למיקום הראשון ומתחיל לכתוב משם.

כדי להוסיף טקסט בסוף קובץ, יש לציין אותו על ידי פעולת OR לוגית בין הדגלים O_WRONLY או O_RDWR לבין הדגל O_ APPEND בארגומנט הדגלי הקלט של הפונקציה open() כאשר הקובץ נפתח. בדרך זו, הסמן ממוקם בסוף הקובץ והכתיבה מתחילה משם. כמו כן, ניתן לשנות את התכונות ואת מצב הכתיבה לאחר פתיחת הקובץ עם הפונקציה fcntl() .

באיור הבא ניתן לראות קוד שמוסיף טקסט בסוף הקובץ שכתבנו בדוגמה הקודמת:

#include

#include

#include

#include

#include

#include

#include

בָּטֵל רָאשִׁי ( )

{

int fd ;

לְהַשְׁחִיר בַּלָם [ 1024 ] = 'הטקסט הזה נוסף. הטקסט הזה נוסף.' ;

fd = לִפְתוֹחַ ( 'מסמכים/example.txt' , O_RDWR | O_APPEND ) ;

לִכתוֹב ( fd , & בַּלָם , סטרלן ( בַּלָם ) ) ;

סגור ( fd ) ;

}

התמונה הבאה מציגה את הטקסט שנוסף. כפי שניתן לראות, בשיטת פתיחה זו, הפונקציה write() מתחילה לכתוב במיקום התו האחרון שנכתב לקובץ:

כיצד לזהות ולזהות את השגיאות שיכולות להתרחש בעת שימוש בפונקציית Write() בשפת C

שימוש ב-write() יכול ליצור שגיאות שונות. כאשר זה קורה, פונקציה זו מחזירה תוצאה ששווה ל-1.

הדרך הקלה ביותר לקבוע אם אירעה שגיאה היא להשתמש בתנאי 'אם' שבו התנאי הוא ערך ההחזרה של -1. כעת, הבה נראה כיצד תוכל להשתמש בשיטה זו כדי לקבוע אם אירעה שגיאה:

int נ ;

נ = לִכתוֹב ( fd , & בַּלָם , סטרלן ( בַּלָם ) ) ;

אם ( נ == - 1 ) {

printf ( 'אירעה שגיאה בעת ניסיון לכתוב את הקובץ.' ) ;

}

אם הפונקציה write() חוזרת עם שגיאה, היא עוברת למשפט 'if' ומדפיסה את ההודעה, ' אירעה שגיאה בעת ניסיון לכתוב את הקובץ '.

כאשר מתרחשת שגיאה, קוד מספרי מאוחסן אוטומטית במשתנה הגלובלי errno המוגדר בכותרת 'errno.h'. ניתן להשתמש בקוד זה כדי לזהות את השגיאה שהתרחשה.

להלן קטע עם השגיאות שהפונקציה write() יכולה ליצור ושמוגדרות בכותרת 'errno.h', יחד עם תיאור קצר של כל שגיאה והערך השלם המשויך:

הַגדָרָה ערך בטעות שְׁגִיאָה
שוב אחד עשר נסה שוב.
EBADF 9 מספר קובץ שגוי.
EDESTADDRREQ 89 נדרשת כתובת יעד.
EDQUOT 122 חרג מהמכסה.
EFAULT 14 כתובת שגויה.
EFBIG 27 קובץ גדול מדי.
EINTR 4 שיחת המערכת נקטעה.
בחירה יחידה 22 טיעון לא חוקי.
EIO 5 שגיאת קלט/פלט.
ENOSPC 28 אין עוד מקום במכשיר.
עֶלִיוֹן 1 פעולה אסורה.

הדרך הקלה ביותר לזהות שגיאה היא לפתוח מתג שבו משתנה ה-erno הוא מצב הקפיצה וכל מקרה הוא הגדרת שגיאה.

לאחר מכן, הבה נסתכל על דוגמה שבה אנו מנסים להזין מתאר עם סימן שלילי, וכתוצאה מכך שגיאה. כדי לזהות שגיאה, אנו משתמשים בתנאי 'אם' שראינו בקטע הקודם. כדי לזהות אותו, אנו פותחים מתג עם שלוש השגיאות הנפוצות ביותר שפונקציה זו יכולה לייצר.

#include

#include

#include

#include

#include

#include

#include

בָּטֵל רָאשִׁי ( )

{

int fd ;

int נ ;

לְהַשְׁחִיר בַּלָם [ 1024 ] = 'שלום עולם' ;

fd = לִפְתוֹחַ ( 'מסמכים/example.txt' , O_RDWR ) ;

נ = לִכתוֹב ( - 2 , & בַּלָם , סטרלן ( בַּלָם ) ) ;

אם ( נ == - 1 ) {

החלף ( טעות ) {

מקרה EBADF : {

printf ( 'מספר קובץ שגוי. שגיאה: %i \n ' , טעות ) ;

לשבור ; }

מקרה בחירה יחידה : {

printf ( 'ארגומנט לא חוקי. שגיאה: %i \n ' , טעות ) ;

לשבור ; }

מקרה EIO : {

printf ( 'שגיאת קלט/פלט . שגיאה: %i \n ' , טעות ) ;

לשבור ; }

}

}

}

כפי שאנו יכולים לראות באיור הבא, הפונקציה write() מחזירה שגיאה כאשר מתאר לא חוקי מועבר כארגומנט קלט. הערך שנשלף מהמשתנה errno משמש כתנאי קפיצה המאפשר לנו לזהות את השגיאה כאשר אנו נכנסים למקרה EBADF.

סיכום

במאמר זה של Linux רמז, הראינו לך כיצד להשתמש בפונקציה write() כדי לכתוב לקבצים. הראינו לך את התחביר ואת התיאור התיאורטי של פונקציה זו. הסברנו גם את שיטות איתור וזיהוי השגיאות, כך שיהיו לך את הכלים והטכניקות הדרושים לפתרון מהיר של בעיות אלו.

כדי לעזור לך לראות איך write() עובד, יישמנו את השימוש בפונקציה זו בדוגמאות מעשיות עם קודים ותמונות המציגות את השימוש בפונקציות זו ובשאר פונקציות עיבוד הקבצים.

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