עזרה עבודה אם קבצים FILE* - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

עזרה עבודה אם קבצים FILE*


c5123

Recommended Posts

התוכנה צריך להדפיס 10 שורות מקובץ

ואז לשאול אם אני רוצה להמשיך ל עוד 10

הבעיה שבפעם השניה זה מדפיס 10 שורות אבל זה מדלג על הרבה שורות

line 1

-

-

line 10

whould you like to see the next 10 lines (y/n)

y

line 40

-

-

line 50

should keep going from line 11 but this not

יש למשהוא רעיון למה זה קופץ ?

program in txt file

[attachment deleted by admin]

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

תודה זה פעל :)

היה לנו שעור אחד על קבצים וקיבלנו עבודה לפסח :s07: אז אז אין לי ניסיון אם קבצים

"והתכנית שלך כתובה בסגנון ממש לא טוב"

ביקורת אם קצת יותר פרטים תתקבל בברכה :xyxthumbs:

ורציתי שהלולאה החיצונית תרוץ עד סוף הקובץ EOF אבל אני לא כל כך בוטח אך לכתוב את התנאי הזה

ניסיתי

while(asaf1!=EOF)1 :bash:

asaf1 is the file pointer

זה לא פעל

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

תוסיף רווחים לתוכנית

אם אתה רוצה לולאה אינסופית יותר יפה לרשום משהו כמו


while(true)
או for(;

במקום מה שרשמת,תשים לב שהיו הזחות בתוכנית

אל תרשום מספרים בצורה מפורשת אלא על ידי קבועים

אם אתה רוצה לרשום גודל של מערך תשתמש ב sizeof

אם תקרא תיעוד תראה ש fgets מחזיר NULL שמגיעים לסוף הקובץ

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

קבועים you mean

define sizeof

?

"אם תקרא תיעוד תראה ש fgets מחזיר NULL שמגיעים לסוף הקובץ"

נכון אבל

זה לא מקדם את המצביע ?

אני חושב שכן וזה יגרום לבעיה

אני ישנה את זה ל while(true) for now

מוריד לי את המשתנה j

:)

שוב תודה

:)

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

מה הבעיה שזה יקדם את המצביע? כל קריאה גם ככה מקדמת את המצביע.

שים לב ש-fgets תחזיר null רק ברגע שהיא מנסה לקרוא מהקובץ, אבל היא כבר בסופו. כלומר, נניח שיש בקובץ 110 תווים, וכל פעם אתה קורה 100 תווים. בקריאה הראשונה יקראו 100 תווים. בקריאה השנייה יקראו 10 התווים הנותרים (הפונקציה עדיין לא תחזיר null). רק בקריאה השלישית הפונקציה תחזיר null.

סתם לדוגמה, ככה צריך להראות קוד כזה בערך:

while (true) {
if (fgetc(...) == null)
/* Reached end of file */
break;
}
/* do other stuff with the input */
}

כמו שנאמר - עדיף להשתמש בקבועים (כלומר define) מאשר "מספרי קסם". כמובן תגדיר קבועים לדברים הגיוניים (אין צורך להגדיר קבוע עבור 0 לדוגמה...)

לא ממש צריך להשתמש ב-sizeof. אם הגדרת קבוע המייצג את גודל המערך אז תשתמש בקבוע הזה בשביל לדעת את גודל המערך, לא ב-sizeof. למעשה, השימוש היחיד ב-sizeof (לדעתי) הוא ב-malloc.

וכמובן, הכי חשוב - הזחה נכונה. כל בלוק (קטע קוד המוקף ב-{}) צריך להיות מוזח ביחס לבלוק שמכיל אותו.

נ.ב. מה זה "rt" בפונקציה fopen?

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

"מה הבעיה שזה יקדם את המצביע? כל קריאה גם ככה מקדמת את המצביע"

אך שהתוכנית כתובה עכשיו זה לא יעבוד אבל

שאני חושב על זה עכשיו אני יכול לעשות את זה אם לולאה אחת ואז זה כן יעבוד

מממ אני ישנה את זה מחר :)

בקשר ל "rt" (הסבר מאתר אחר )

בעבר (ועד היום ב-Windows), לפונקציה fopen היו 2 מצבים: "מצב טקסט" ו"מצב בינארי".

במצב בינארי, שהוא ברירת מחדל (כלומר לא מוסיפים כלום ל-r ו-w או מוסיפים b) כל פונקציות הקריאה והכתיבה מתייחסות לנתונים AS IS, כלומר לא מנסות לפרש את הבייתים בתוך הקובץ.

במצב טקסט, מתבצע פרוש מסוים לסוף שורה.

n\ בודד הופך ל-n\r\ בכתיבה ולההפך קורא בקריאה. כמו כן, יש התייחסות ל-Ctrl + Z כסוף קובץ (לפחות כך לפי תיעוד של MS)

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

:s07: :s07: :s07: :s07: :s07: :s07: :s07: :s07: :s07::kopfpatsch:

עוד שאלה על fread

זה מחזיר לי 0

fread לא פעול ואני לא מבין למה

התוכנה אמורה לשלוח 2 מספרים מקובץ לזיכרון

תוכנית בקובץ

ניסיתי כל כך הרבה דברים וזה לא עובד help

[attachment deleted by admin]

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

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

חוץ מזה, אתה קורא מהקובץ וכותב אליו בצורות שונות לחלוטין. או שתשתמש ב-fprintf ו-fscanf, או שתשתמש ב-fwrite ו-fread. אל תערבב.

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

int ptr[size];

חוץ מזה, נהוג לסמן קבועים באותיות גדולות בלבד (SIZE במקום size).

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

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

אתה צריך להחליט על פורמט הקובץ שאתה רוצה שישמר, ולהשתמש בפונקציות המתאימות (יש לך גם fscanf ו- fwrite בהתאמה).

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

אוי... מוזר.. לא ראיתי את עמוד 2.

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

מממ עוד פעם צריך עזרה sorry

תרגיל:

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

שמעדכנת נתון של רשומה ספציפית ע"י גישה ישירה לקובץ? גישה ישירה לקובץ....?

טוב אז אני לא ממש בטוח אך fseek עובד, אך שהבנתי אתה נותן לו מיקום וזה ישנה את ה file pointer למקום החדש אם אפשרות להתחיל מהסוף או התחלה

הבעיה :יש לי מיבנה של 3 מחרוזות שם פרטי. שם משפחה. וטלפון

בתוכנית אני רץ על מערך של מיבנים ושומר אותם על הקובץ

fseek רץ על הנתונים בקובץ לא המצביע אז בו נגיד שאני ישלח אותו ל 3 זה יתן לי את המספר טלפון של השם הראשון?

טוב אני דיי בטוח שלא הבנתי עוד הסוף אך fseek פועל אז אם משהוא יכל להסביר אם דוגמא קטנה :)

עוד שאלה אני עשה malloc למצביע של struct הבעיה היא שאני לא יכל לדעת כמה מיבנים יש בקובץ ?

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

תודה מראש

וחג שמח.

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

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

אם תקפוץ למקום 3 בקובץ, אז כנראה תנחת באמצע המחרוזת של השם הפרטי של המבנה הראשון.

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

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

בשביל לדעת מה גודל הקובץ אפשר לעשות fseek לסוף הקובץ, ואז ftell כדי לדעת את המיקום של המצביע (יש כאן בדיוק דוגמה שמראה איך עושים את זה).

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

ארכיון

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

×
  • צור חדש...