ABA


"C: עזרה עם קבצים (לא מצליח לכתוב לקובץ)"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #10355 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 10355
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   08:28   21.04.11   
אל הפורום  
  C: עזרה עם קבצים (לא מצליח לכתוב לקובץ)  
 
   יש לי מצב ממש מוזר...

ב main פתחתי קובץ במצב r+ לקריאה וכתיבה (פתיחת הקובץ הצליחה)
וכתבתי 2 פונקציות... האחת משנה ערך מסוים בקובץ והאחרת משנה ערך אחר.
פונקציה אחת מצליחה לכתוב לקובץ ולשנות את הערך והשניה עובדת מצויין חוץ מהשורה של כתיבה לקובץ.. אני מגיע אליה כנדרש שאני עובר עם debug אבל ההדפסה עצמה לקובץ לא מתבצעת ואני לא מצליח להבין למה.

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

מה יכולות להיות הסיבות שכתיבה לא מתבצעת לקובץ אם הקובץ נפתח כשורה למצב r+?


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  סגרת את הסטרים לקובץ בסיום הפונקצייה הראשונה? hm10 21.04.11 10:05 1
     אם הפונקציות לא פועלות במקביל אז אין סיבה לפתוח כמה עידן_הכלי 21.04.11 10:34 2
         חח כן צודק טעות שלי.. hm10 21.04.11 11:31 4
  אולי אתה שוכח לאתחל את ה-f_des לתחילת הקובץ מחדש ldan192  21.04.11 10:42 3
  פתרתי את הבעיה, ניסיתי לכתוב על EOF וזה פשוט ShocKi  21.04.11 17:25 5
     נסה להכניס ldan192  21.04.11 19:03 6
         זה לא עובד.. ShocKi  21.04.11 19:18 7
             שניה, מחדש, מה המטרה של התרגיל בעצם? ldan192  21.04.11 19:25 8
                 אני אסביר ShocKi  21.04.11 19:49 9
                     הםםם כי עשית פה דבר אסור ldan192  21.04.11 20:28 10
                         תשמע.. הקוד עובד.. ShocKi  21.04.11 20:57 11
                             שוב, שים גרש אחד, לא שניים... ldan192  21.04.11 21:17 12
                                 להלן הקוד: ShocKi  21.04.11 21:56 13
                                     תשמע, קודם כל שים לב שאתה מבצע parsing ldan192  21.04.11 22:36 14
                                         מה זה parsing? ShocKi  21.04.11 23:53 15
                                             אני מבין, בכל מקרה הבעיה אצלך מסתכמת ldan192  22.04.11 00:21 16
                                                 מה זה / r? ShocKi  22.04.11 10:29 17
                                                     זה לא באמת בזבוז של זכרון אם ההבדל הוא 10 תווים בממוצע ldan192  22.04.11 11:24 18
                                                         תודה על העזרה ShocKi  23.04.11 00:52 19
                                                             בכיף. אני מבין שזה עזר בסוף? ldan192  23.04.11 12:55 20
                                                                 וואלה לא.. אבל הפסקתי לנסות. ShocKi  23.04.11 18:02 21

       
hm10
חבר מתאריך 24.9.09
322 הודעות
   10:05   21.04.11   
אל הפורום  
  1. סגרת את הסטרים לקובץ בסיום הפונקצייה הראשונה?  
בתגובה להודעה מספר 0
 
   תעבוד עם ה-apis
createfile
writefile
readfile

כך תוכל לפתוח קובץ ושיהיה אפשר לפתוח לו כמה handles (שיתוף)..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
עידן_הכלי

   10:34   21.04.11   
אל הפורום  
  2. אם הפונקציות לא פועלות במקביל אז אין סיבה לפתוח כמה  
בתגובה להודעה מספר 1
 
   HANDLES, אפשר להשתמש באותו אחד.

תנסה לעשות משהו כזה:

void printHello(FILE* file){
fprintf(file, "%s\n ", "Hello");
}

void printBye(FILE* file){
fprintf(file, "%s\n ", "Bye");
}

void main() {
FILE *fp;
fp = fopen("MYFILE.txt", "r+");
printHello(fp);
printBye(fp);

fclose(fp) ;
}


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
hm10
חבר מתאריך 24.9.09
322 הודעות
   11:31   21.04.11   
אל הפורום  
  4. חח כן צודק טעות שלי..  
בתגובה להודעה מספר 2
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   10:42   21.04.11   
אל הפורום  
  3. אולי אתה שוכח לאתחל את ה-f_des לתחילת הקובץ מחדש  
בתגובה להודעה מספר 0
 
כשאתה כן מצפה לזה?
כשאתה פותח את הקובץ הדסקריפטור מתקדם עד למקום האחרון שכתבת בקובץ (או חיפשת וכו').
נסה לקרוא ל-rewind.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   17:25   21.04.11   
אל הפורום  
  5. פתרתי את הבעיה, ניסיתי לכתוב על EOF וזה פשוט  
בתגובה להודעה מספר 0
 
   לא נתן.. רק שבמקום לתת שגיאת הרצה הוא פשוט קימפל ולא עשה כלום...
תודה לכל מי שניסה לעזור

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


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   19:03   21.04.11   
אל הפורום  
  6. נסה להכניס  
בתגובה להודעה מספר 5
 
fprintf(file, "%c\0", the_char);


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   19:18   21.04.11   
אל הפורום  
  7. זה לא עובד..  
בתגובה להודעה מספר 6
 
   אין גם סיבה שזה יעבוד..
ברגע שאתה כותב %c אחד אתה אומר לו להחליף במקום תו אחד..
אני רוצה שיקח 2 תוים ובמקום ירשום תו אחד ויחיד.

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


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   19:25   21.04.11   
אל הפורום  
  8. שניה, מחדש, מה המטרה של התרגיל בעצם?  
בתגובה להודעה מספר 7
 
ערכתי לאחרונה בתאריך 21.04.11 בשעה 19:30 בברכה, ldan192
 
לשכתב קובץ מבלי לפתוח שני דסקריפטורים?

נסה אולי משהו כזה:
fprintf("%c%d\n", the_char, EOF);
אבל שוב, קח בחשבון שה-EOF לא באמת נעלם.
לא עשית באמת resize לקובץ עצמו, הסקטורים כבר הוקצו מראש (בפעם הראשונה שפתחת-סגרת את הקובץ).


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   19:49   21.04.11   
אל הפורום  
  9. אני אסביר  
בתגובה להודעה מספר 8
 
   ערכתי לאחרונה בתאריך 21.04.11 בשעה 19:56 בברכה, ShocKi
 
ראשית EOF לא טוב, כי השינוי יכול להתבצע באמצע הקובץ.

יש לי קובץ שנראה כך
http://gyazo.com/cef4dcb4969a2955e063706dd153332c.png
כלומר, בסוף של שורה יש לי מספר חד ספרתי.. לפעמים יש לפניו מקף שמציין כביכול מינוס ולפעמים לא.
אני רוצה בכל מקרה להחליף את המספר הזה בכל שורה נניח למספר 5.

אני צריך דרך שבעזרתה אני אוכל להחליף את ה -1 בתו 5.
לעשות שינוי על ה 3 למשל זה לא בעיה כי זה להחליף תו בתו... לעשות שינוי על ה -1 זה כבר קשה.

הפרדתי ל-2 מצבים.. נניח שאני מטפל עכשיו במצב של המספר השלילי.. השורה שכתבתי היא:
http://gyazo.com/c009be019d90d3208b5afd1c87c9eadb.png
כאשר New הוא 5
אבל בקובץ זה נותן לי
http://gyazo.com/cb1ac0ee835bc84b02940e92ea2a40b0.png
וכמו שאתה שם לב יש רווח מיותר בסוף השורה שהיה בה מספר שלילי (תתעלם מכך שהשם לא תואם)


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   20:28   21.04.11   
אל הפורום  
  10. הםםם כי עשית פה דבר אסור  
בתגובה להודעה מספר 9
 
אתה נותן מחרוזת "..." (char*) ומדפיס char.
הוא בעצם בכלל מסתכל על כתובת זכרון ולא על ערך!

בנוסף לזה ה-0\ הפוך (אצלך 0/).
פשוט תרשום 0(char) שמקביל ל-'0\' (כמו שרואים ויזואלית פה, אל תעתיק ישירות מרוטר כי הוא הופך פה את המספרים).

0\ מסמל סוף מחרוזת (ולכן הוא לא ידפיס את השורה מכאן והלאה, גם לא רווח).


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   20:57   21.04.11   
אל הפורום  
  11. תשמע.. הקוד עובד..  
בתגובה להודעה מספר 10
 
   הוא כן חוקי.. הבעיה היא שהוא עושה רווח בתו האחרון.. ואני לא רוצה שיהיה שם רווח.. אני לא מתעסק בתוכנית עם פוינטרים.. בכלל.. אז אין סיבה שהוא יסתכל על כתובות. הפוינטרים היחידים שיש לי הם FILE *.

אם אני הופך את הקו של הסלאש כמו שאמרת זה נותן לי תו מוזר
http://gyazo.com/c864e4938bcd44d53c3cb9933456521a.png


מה שכתבת עם ה 0 char עושה 2 רווחים...


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   21:17   21.04.11   
אל הפורום  
  12. שוב, שים גרש אחד, לא שניים...  
בתגובה להודעה מספר 11
 
גרשיים זה פויינטר ובגלל זה הוא מדפיס לך מקטע שרירותי מפויינטר שהוא זבל...

בוא תעלה את הקוד.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   21:56   21.04.11   
אל הפורום  
  13. להלן הקוד:  
בתגובה להודעה מספר 12
 
   אני בספק אם תבין ממנו הרבה.. זה קטע קטן מתוך תוכנית ענק :|




while (fscanf(pf_d,"%d",&IDD)!=EOF)
{
if (IDD==ID)
{
int i;
for(i=0;i<3;i++)
{
fseek(pf_d,1,1);
fscanf(pf_d,"%s",str);
}
fseek(pf_d,1,1);
if (fgetc(pf_d)=='-')
{
fseek(pf_d,-1,1);
fprintf(pf_d, "%d%c", New,(char)0);

}
else
{
fseek(pf_d,-1,1);
fprintf(pf_d, "%d", New);
}
return 1;
}
else
fgets(garbage,max,pf_d);

}


http://gyazo.com/2438d3461ef36a63578dc81859c08787.png

בפקודות הזנה ביקשתי שבשורה הראשונה והשניה המספר ישתנה ל 5, ובשורה השלישית המספר ישתנה ל 4. להלן הפלט
http://gyazo.com/2cb4be1a2a5bb39d0e19186efec6911c.png

מה הבעיה?
בשורות 1,2 יש רווח כפול אחרי המספר..
בשורה 3 יש רווח יחיד אחרי המספר..


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   22:36   21.04.11   
אל הפורום  
  14. תשמע, קודם כל שים לב שאתה מבצע parsing  
בתגובה להודעה מספר 13
 
לתוכן שאתה סנטימטר אחרי זה משנה... לא בריא במיוחד (מבחינת תכנותית).
עדיף שתיקח את כל השורה עם fgets (כאורך שורה מקסימלית)
ואז תערוך בה את התוכן של הטקסט.

מה קורה כשאתה לא מקבל את התו כ-%c אלא רושם ישירות
fprintf("%d\0");
?

אני חושש פשוט שבמקרה שלך הוא רואה רצף על \0\0 ולכן כשאתה פותח אח"כ בכתבן הוא מראה לך את זה כרווח.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   23:53   21.04.11   
אל הפורום  
  15. מה זה parsing?  
בתגובה להודעה מספר 14
 
   המשתנים בתוכנית הם רק מתווכים.. המטרה היא שהשינוי יהיה בקובץ.

לגבי השאלה השניה שלך, אין הבדל הוא עדיין עושה רווח כפול.


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


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   00:21   22.04.11   
אל הפורום  
  16. אני מבין, בכל מקרה הבעיה אצלך מסתכמת  
בתגובה להודעה מספר 15
 
בזה שהכתבן מסמן את 0\ כרווח.
השאלה אם בודקים את הפלט שלך ב-diff (משווים פלטים)
כי אם כן - איך שלא "תמלא" את הרווחים - אתה תשאר בבעיה (בהנחה שהם מצפים שהטקסט יהיה רציף).
תזכור שהאנטרים זה דבר פסיכולוגי ובעצם זה טקסט רציף עם n\ לירידת שורות.
אתה יכול בעיניי לשים r\-ים במקום התווים, אני מאמין שאז זה באמת ימלא את הרווחים בכלום, השאלה היא איך באמת משווים את הטקסטים.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   10:29   22.04.11   
אל הפורום  
  17. מה זה / r?  
בתגובה להודעה מספר 16
 
   אני התייחסתי לאנטר כאל 10,13 ....

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


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   11:24   22.04.11   
אל הפורום  
  18. זה לא באמת בזבוז של זכרון אם ההבדל הוא 10 תווים בממוצע  
בתגובה להודעה מספר 17
 
ערכתי לאחרונה בתאריך 22.04.11 בשעה 11:27 בברכה, ldan192
 
מול 50 תווים.
בכל מקרה, זה לא מה שמפריע, פשוט פחות נהוג ב-parsing (הסבה של טקסט הקלט לקלט שהתוכנית שלך תדע לעבד).

ו-r\ זה 13 (carriage return).
בגדול בווינדוז מספיק רק n\ (שזה 10), אבל נראה כבר שהקומפיילרים שמים גם \r לצורכי תאימות.
בכל מקרה, \r\r כמה פעמים שלא יהיה - לא מזיק, אז שווה לנסות את זה.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   00:52   23.04.11   
אל הפורום  
  19. תודה על העזרה  
בתגובה להודעה מספר 18
 
  


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   12:55   23.04.11   
אל הפורום  
  20. בכיף. אני מבין שזה עזר בסוף?  
בתגובה להודעה מספר 19
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   18:02   23.04.11   
אל הפורום  
  21. וואלה לא.. אבל הפסקתי לנסות.  
בתגובה להודעה מספר 20
 
   אני שוקל אם לשאול את המרצה אם זה כל כך קריטי.. כי בתאכלס אחרי הרבה בדיקות הרווחים האלה שנוצרים בסוף לא משפיעים על הביצוע של התוכנית.. הם פשוט מיותרים...

אבל מצד שני, אני לא רוצה להעיר מתים :|


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net