קבצים - בעיה בקליטת מחרוזות משורה

Ron 417

New member
קבצים - בעיה בקליטת מחרוזות משורה

זו השורה :
SHUKIandSons opticalConnector 5 12:05​
וזה הקוד:
void main () { FILE *fp1; char name[len],product[len],time[6]; int n=0,amount; amount=fscanf(fp1,"%[a-zA-Z]%[a-zA-Z]%d%5s",name,product,n,time); }​
הamount מקבל ערך 1 ורק מחרוזת ראשונה - SHUKIandSons - מועברת למשתנה name .שאר ה3 לא מצליחים. יש למישהו רעיון מה הבעיה עם השורה של האחוזים ב scanf ?
 

vinney

Well-known member
פורום שפות תכנות זאת הכתובת בשבילך

וכמובן - תקרא את התיעוד, יש לך שם כמה טעויות.
 

vinney

Well-known member
של פונקציית scanf

ובפרט של פרמטר הformat string. חפש בגוגל, יש הרבה דפי manual ברשת, זאת פונקציה סטנדרטית, כך שבכולם כתוב אותו דבר.
 

Ron 417

New member
האמת שאני עובד לפי גוגל

וזה מה שיוצא,רק שהמחרוזת הראשונה - SHUKIandSons - נקלטת אל תוך name ,והשאר לא. amount מקבל ערך 1 וזהו. שיניתי ושיניתי אבל עדין לא עובד. תודה
 

vinney

Well-known member
שכחת s בסוף הגדרת השדה

לדעתי. תבדוק שוב.
 

Ron 417

New member
אגב נדגיש שאני עובד עם קובץ

כך שלצורך העניין ,כאן ,אפשר להתייחס בתור Sscanf ולא F .
char name[30],product[30],time[6]; int n,amount; amount=sscanf("SHUKIandSons opticalConnector 5 12:05" , "%[a-zA-Z]%[a-zA-Z]%d%5s",name,product,n,time); }​
ועדיין רק המחרוזת הראשונה מצליחה.
 

vinney

Well-known member
זה לא משנה

כל משפחת הscanf והprintf עובדת באותה השיטה.
 

Ron 417

New member
אממ אוקיי

עדיין ,הבעיה פה:
"%[a-zA-Z]%[a-zA-Z]%d%5s"​
ושיניתי ל
"%[a-zA-Z]s%[a-zA-Z]s%d%5s"​
והוא עדיין לא קולט.
 

vinney

Well-known member
למה שלא תשתמש בs% וזהו?

כשאתה משתמש ב[], אז מתייחסים גם לרווחים, שלא נכללים בקבוצה, ולא מתבצע הקלט. לדעתי זאת הבעיה שלך.
 

Ron 417

New member
צודק וזה גם מה שעשיתי

זה עובד בסדר. יש לי עוד שאלה : אני רוצה לעבוד עם קובץ ולזכור מספר שורה ,נאמר שורה מספר 5. לפי מה שיצא לי להבין מהמרצה ,לקובץ יש "סמן" שמצביע על התו הנוכחי בקובץ .זה תקף ל fgets וגם לכל וריאציות ה scanf ו printf ? אני אחדד קצת יותר : צריך לרוץ על קובץ ,לקחת שורה ראשונה ולעבוד איתה. עבור אותה שורה ראשונה צריך לרוץ על כל שאר הקובץ ולבצע פעולות. כאשר סיימתי את כל הפעולות הללו {עבור שורה ראשונה},צריך לעבור לשורה השניה {מכיוון שכעת סיימתי עם השורה הראשונה} . יש לך רעיון מה אני יכול לעשות כדי להגיע לשורה השניה כעת ?
 

vinney

Well-known member
מושג "שורה" חסר כל משמעות

"שורה" זה מאפיין ייצוג המידע, לא המידע עצמו, המידע עצמו זה רצף בינארי (binary stream). איך אתה סופר שורות תלוי מה אתה מפרש כשורה. בד"כ בקבצי טקסט שורה זה כל רצף תוים עד התו n\. כדי לספור שורות - סופרים n\ים
 

Ron 417

New member
עדיין לא ברור לי משהו

יש לי קובץ something.txt וכאשר אני פותח אותו דרך notepad של XP אני לא רואה שום n\ . אבל כאשר אני אומר FILE *fp ופותח את אותו SOMETHING וfp יצביע עליו ,אז בסוף כל שורה יש את ה n\ ? ואיך אני יודע שהגעתי לסוף קובץ ? כל עוד שונה מ eof ?
 

vinney

Well-known member
כן

יש פונקציות קלט כמו fscanf או fgets שמעלימות את הn\ ומשתמשות בו לפירמוט (מתוך אותה ההנחה שn\ מייצג סוף שורה). אבל אם תפתח את הקובץ כקובץ בינארי ותקרא עם fread - בהחלט תראה אותם. איך מגלים שהגענו לסוף הקובץ? עם פונקציית feof , כמה שזה מפתיע
 

vinney

Well-known member
זהו שלא

בC שורה חדשה זה "n\", וניתוח קבצי טקסט מסתמך על ההנחה הזאת. אבל 0d0a זה ֿr\n\, שני תוים.
 
למעלה