קבצים בינאריים ב-C - עמוד 2 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

קבצים בינאריים ב-C


slimshady21

Recommended Posts

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

אבל אם זה סתם קובץ שלא אני עשיתי, איך אני אמור לדעת?

וחוץ מזה, נגיד גם כתבו את הקובץ הזה ב-long או double , אז זה עוד יותר בתים. אין איזו דרך לדעת?

תחזור על לולאות ומחרוזות, שם הבעיה שלך בהעתקת הקובץ.

אני מסתכל ואני לא מבין איפה הבעיה.... וחוץ מזה אין פה העתקת קובץ- התוכנית הראשונה מדפיסה מחרוזת מתוך קובץ והשנייה מכווצת קובץ בשיטת RLE

וגם עדיין לא הבנתי, כשכותבים מספר שהוא גדול מ-255, לקובץ בינארי- אז מה זה הסימן הזה שרואים כשפותחים את הקובץ? זה לא יכול להיות תו אסקיי כי זה מספר גדול מ-255

קישור לתוכן
שתף באתרים אחרים

אם אתה עובד על קבצים בינאריים, תשתמש ב- fread ו- fwrite.

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

וגם עדיין לא הבנתי, כשכותבים מספר שהוא גדול מ-255, לקובץ בינארי- אז מה זה הסימן הזה שרואים כשפותחים את הקובץ?

השאלה היא איך כתבת אותו, ואיך אתה קורא אותו.

אם כתבת אותו בתור טקסט עם printf למשל, אז הוא יופיע כטקסט (כל ספרה תתפוס char שלם).

אם כתבת אותו בתור int, אז הוא יהיה בקידוד בינארי (סדר הבתים יכול להשתנות לפי סוג המעבד) ויתפוס 2 או 4 בתים.

קישור לתוכן
שתף באתרים אחרים

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

אבל חוץ מזה, השאלה שלי הייתה אחרת- נכון נגיד אתה כותב מספר לקובץ בינארי- למשל 65. אז כשאתה פותח את הקובץ הזה לקריאה (עם נוטפאד), אתה רואה את הערך אסקיי שלו- A , נכון? עכשיו- מה קורה כשכותבים מספר שהוא גדול מ-255. מה הסימן שרואים?

קישור לתוכן
שתף באתרים אחרים

נראה לי שאתה לא ממש מקשיב לי.

אם אתה כותב משתנה לקובץ בינארי. הוא יופיע בקובץ כמו שהוא מופיע בזיכרון - כלומר בקידוד המתאים. משתנה מסוג double נשמר בצורה יותר מורכבת, כי הוא מיוצג כ- 8.8 כפול 10 (בחזקת 1), ויתפוס 8 בתים.

אם לקחת קובץ רנדומלי שאין לך שום מידע עליו, אין משמעות ל"להעתיק ממנו את הערכים", כי אין לך מושג איך לפרש את המידע שבו.

קובץ שאתה לא יודע עליו כלום אתה יכול להציג לפי כל קידוד (Hex, ASCII או כל קידוד אחר).

notepad מפענח קידוד ASCII (הוא גם מפרש תווי בקרה כמו טאבים ו- newlines), ולכן אם הערך של ביית מסויים הוא 65 אז הוא יציג את התו 'A'.

מספר גדול מ- 255 אתה לא יכול לקודד ב- ASCII.

אם תכתוב אותו כ- int הוא יתפרש על פני כמה בתים.

אם תנסה לקרוא אותו כ- ASCII אתה תקבל עבור כל ביית את הערך ASCII שלו.

קישור לתוכן
שתף באתרים אחרים

טוב תודה נראה לי שהבנתי.

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

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...