עבור לתוכן
View in the app

A better way to browse. Learn more.

HWzone

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Featured Replies

פורסם

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

פורסם
  • מחבר

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

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

וחוץ מזה, נגיד גם כתבו את הקובץ הזה ב-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 . ככה זה באמת או שזה בעיה בתוכנית? ודרך אגב זה גם משתנה בסוגים שונים של קבצים (בכל פורמט יש תוצאות שונות)

ארכיון

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

דיונים חדשים

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.