שאלה ב c

zamorano

New member
שאלה ב c

שלום, אני צריך עצה אני צריך לכתוב תוכנית שקוראת קובץ ascii עם מספרים ולכתוב אותם בצורה בינארית (נניח שבקובץ ascii יש מספר ידוע של תווים בכל שורה אך לא ידוע מספר השורות) השאלה שלי : 1. איך לקרוא את הקובץ ascii (פקודת fread או משהו אחר, מספר השורות לא ידוע לי) 2. איך להמיר לבינארי הכול בשפת c תודה
 

eyalbd

New member
תן דוגמא קצרה לקובץ קלט

זה לא כ"כ מורכב אבל אתה חייב להגדיר לעצמך (או לדעת - אם הגדירו לך) ב 100% את הפורמט של הקלט ובתוכנית שלך לקבל רק אותו. כאשר תדע את פורמט הקלט ההמשך יהיה ברור יותר.
 

zamorano

New member
דוגמא

קובץ קלט מהצורה : 10001010 01011010 00100010 ... כל שורה נניח 8 תווים ( 1 או 0 ), מספר שורות לא ידוע
 

eyalbd

New member
קוים כלליים

עבור כל שורה בצע את הפעולות הבאות א. הגדר משתנה מטיפוס INT שיהיה המספר שיודפס. אתחל אותו לאפס ב. קלוט תו תו בשורה ע"י fgetc . ג. אם סוף שורה 'n\' הדפס את המספר מ (א') והתחל מחדש עבור השורה הבאה ד. ודא שהתו הנקלט הוא '0' או '1'. אם לא שגיאה ה. וודא שאתה לא חורג מהאורך המוגדר ע"י פורמט הקובץ. ו. עדכן את התוצאה הזמנית של המשתנה מ (א'). טפל במקרים של סוף קובץ יאללה לעבודה.
 

אלדד28

New member
ולגבי ההמרה לבינארי,

אם תיזכר בתהליך, אתה אמור להכפיל כל ספרה בינארית בחזקה של 2. או נניח יש לך 8 ספרות בכל שורה, אתה אמור להכפיל את הספרה הראשונה ב-128, את השניה ב-64, וכן הלאה עד להכפלת הספרה האחרונה-1. סכום התוצאות ייתן לך את המספר בבסיס עשרוני.
 

zamorano

New member
לצערי ממש לא הבנתם את השאלה ../images/Emo10.gif

לא דיברתי על המרה של מספרים בבסיסים שונים !
הבעיה שלי היא כזו : אני מקבל קובץ ascii עם תווים '1' '0' לדוגמא : '00110101' כאן יש 8 תווים כל אחד הוא בעצם תו בטבלת ascii , אני רוצה להפוך את הקובץ לקובץ בינארי - הגודל של קובץ כזה יהיה (לפי הדוגמא הזו)1 byte כי כל '0' או '1' הפך להיות ביט - כלומר כל תו ascii אחד - '1' או '0' הפך להיות ביט אם מישהו הבין את השאלה ויוכל לעזור לי אודה לו מאוד !!!
 

zamorano

New member
???

שוב אני מסביר : איני מעונין בהמרה בין בסיסים, לדוגמא איני מעונין להמיר 10000001 ל 129 או להפך, הדפסה בצורת printf("1") שקולה להדפסה של תו ascii אני מעונין לקבל קובץ בפורמט בינארי (אי אפשר לראות קובץ כזה בעורך גרפי)
 

אלדד28

New member
אם כך,

תעשה בדיוק את מה שאמרנו, אבל בנוסף הדפס את התווים בתור char-ים לקובץ בינארי שתפתח דרך fopen. קרא ב-fopen איך פותחים קובץ, והשתמש ב-fputc כדי לכתוב תו לקובץ.
 
תבין...../images/Emo26.gif

כשאתה קורא 10000001 מקובץ אחד, וכותב את תו ה-ASCII עם ערך 129 לקובץ שני - מה שלמעשה נכתב לקובץ זה לא התו... מה שנכתב זה הביטים 10000001... אין איזה ייצור מסתורי "פורמט בינארי" - זה ה"פורמט הבינארי" שלך...
 

zamorano

New member
תשובה

משעמם לי, אז הנה התשובה : קובץ בינארי הוא קובץ ב "שפת מחשב" לא ניתן לראות אותו בעורך גרפי עכשיו נניח שיש בעיה כזו , יש לי קובץ ascii עם השורה "10101010" הגודל של קובץ כזה הוא 8byte כי יש בו 8 תווים של 1 byte, אני רוצה להפוך אותו לקובץ בינארי עם מידע "שקול" (לוגית כמובן), כלומר קובץ בגודל 1 byte שיש בו "10101010" (לא ניתן לראות את זה בעין אבל המחשב יבין את זה) מה שצריך לעשות הוא לקחת כל תוו Ci מהמחרוזת המקורית (8 תווים) ולעשות ci = ci - '0' for each i=1..8 ואז בכל תוו יהיה 00000001 או 00000000 ואז צריך לקחת את 8 התווים ולהפוך אותם לתוו אחד (הרצוי) : C = C1<<7 | C2 <<6 | C5 << 5 וכך הלאה (מתמטיקה בוליאנית), כך קיבלנו תוו חדש עם הביטים הרצויים, אם נעשה printf("%c",c) //print נראה את תוו ה ascii שערכו 10101010 אם נכתוב fwrite((*void)c,1,1,file); //write נקבל קובץ בינארי בגודל 1 byte עם אותו מידע (בתנאי שפתחנו את file בצורה בינארית) זהו
 
למעלה