נושאים פעיליםנושאים פעילים  הצגת רשימה של חברי הפורוםרשימת משתמשים  חיפוש בפורוםחיפוש  עזרהעזרה
  הרשמההרשמה  התחברותהתחברות RSS עדכונים
תיכנות
RSS UnderWarrior Forums : RSS תיכנות
נושא

נושא: חיפוש סטרינג בתוך קובץ [ב C]

שליחת תגובהשליחת נושא חדש
כותב
הודעה << נושא קודם | נושא הבא >>
pitbull
משתמש חבר
משתמש חבר
סמל אישי

הצטרף / הצטרפה: 14 May 2005
משתמש: מנותק/ת
הודעות: 209
נשלח בתאריך: 11 October 2005 בשעה 23:11 | IP רשוּם
ציטוט pitbull

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

char line[80];
char query[20];
int length;
int i=0;
char ch;
char str[20];


void search()
   {
   f=fopen(file_name,"r");
     printf("\nenter query to serch: ");
     scanf("%s",&query);
     length=strlen(query);
    for (i=0; i<=length && ch!=EOF; i++)
       {
       fscanf(f,"%s", &ch);
       str=ch;
      if ( strcmp(str,query)==0 )

       printf("\nthe string found!!");


      }
       fclose(f);
   }



מה לא נכון?
[אין טעות קומפילציה, התוכנית רצה אבל החיפוש עצמו לא מחזיר תשובה נכונה]
הנה הקוד המלא למי שרוצה:
קוד:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include<string.h>

FILE *f;
char name[15];
char phone[30];
char file_name[]="db.txt";
char line[80];
char query[20];
int length;
int i=0;
char ch;
char str[20];
char c;




void write_2_file()
  {

    f=fopen(file_name,"a+");

    printf("\nplz enter phone number: ")  ;
   scanf( "%s" , &phone);
   printf("\nplz enter name: ");
   scanf("%s", &name);


    fprintf(f, "name: %7s | phone: %s\n", name,phone);
    fclose(f);

    printf("\nfile saved!\n");


  }

void show_all()
   {
   f=fopen(file_name,"r");


   while ( fgets(line, 80, f) !=NULL )
    {
    printf("%s",line);
    }

   fclose(f);
   }

void search()
   {
   f=fopen(file_name,"r");
     printf("\nenter query to serch: ");
     scanf("%s",&query);
     length=strlen(query);
    for (i=0; i<=length && ch!=EOF; i++)
       {
       fscanf(f,"%s", &ch);
       str=ch;
      if ( strcmp(str,query)==0 )

       printf("\nthe string found!!");


      }
       fclose(f);
   }

void main()
  {
    clrscr();
    printf("Oragnaizer\n\n");
    printf("--------------------\n\n");

    printf("welcome to your organizer, please select task:\n");
    printf("1) show all [press s] \n");
    printf("2) add new phone [press a]  \n\n");
    do
    {
    c=getch();
    if (c=='a')
  write_2_file();
     if (c=='s')
    show_all();
    } while (c!='q');



  }



חזרה לתחילת העמוד הצג את כרטיס החבר של pitbull חפש הודעות אחרות של pitbull
 
ShadowBeast
אחראי פורומים
אחראי פורומים
סמל אישי

הצטרף / הצטרפה: 22 January 2005
מדינה: Israel
משתמש: מנותק/ת
הודעות: 1073
נשלח בתאריך: 11 October 2005 בשעה 23:43 | IP רשוּם
ציטוט ShadowBeast

wtf is going on?
read the guide that nir wrote, about file handling
you have to make some pointers and crap
READ the guide

__________________
The highest knowledge is to know that we are surrounded by mystery - Albert Schweitzer

He who will not take the hint, must take the consequence - Glenn v. Covey (1854)

ShadowBeast
חזרה לתחילת העמוד הצג את כרטיס החבר של ShadowBeast חפש הודעות אחרות של ShadowBeast
 
Nameless
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 12 October 2005 בשעה 00:00 | IP רשוּם
ציטוט Nameless

תוסיף בהתחלה

קוד:

#include <stdio.h>
#include <stdlib.h>



stdio בשביל כל ה scanf printf
stdlib בשביל הקבצים

תהפוך את void main ל
int main
ובסוף לפני ה { האחרון תשים return 0;

ולמה שמת את המשתנים כמשתנים גלובליים?
זה לא נחוץ

חזרה לתחילת העמוד הצג את כרטיס החבר של Nameless חפש הודעות אחרות של Nameless בקר בדף הבית של Nameless
 
pitbull
משתמש חבר
משתמש חבר
סמל אישי

הצטרף / הצטרפה: 14 May 2005
משתמש: מנותק/ת
הודעות: 209
נשלח בתאריך: 12 October 2005 בשעה 08:00 | IP רשוּם
ציטוט pitbull

ShadowBeast כתב:
wtf is going on?
read the guide that nir wrote, about file handling
you have to make some pointers and crap
READ the guide


לא לא לא, אמרתי זה רק קטע תוכנית....
פשוט תבדקו את האלגוריתם, האם הוא טוב?
אני לא מוצא בו שום טעות אבל משום מה זה לא מוצא את הסטרינג...
עריכה:
שמתי עכשיו את הקוד המלא אם זה עוזר למישהו..
כל הפונקציות עובדות כמו שצריך
רק הפונקצייה search() עושה בעיות..
חזרה לתחילת העמוד הצג את כרטיס החבר של pitbull חפש הודעות אחרות של pitbull
 
ניר
מנהל האתר
מנהל האתר
סמל אישי

הצטרף / הצטרפה: 12 January 2005
מדינה: Israel
משתמש: מנותק/ת
הודעות: 3296
נשלח בתאריך: 12 October 2005 בשעה 09:04 | IP רשוּם
ציטוט ניר

בעיות:
1. שימוש במשתנים גלובליים
2. קריאת מחרוזת %s לתוך תו בודד (ch)
3. השמת תו למחרוזת
4. אתה עושה לולאה אבל לא משתמש בכלל במשתנה i שבה.

יש עוד המון בעיות - הקוד בכלל לא בכיוון

__________________
מספר האייסיקיו שלי ו/או כתובת ה-MSN שלי אינם מהווים מוקד תמיכה
חזרה לתחילת העמוד הצג את כרטיס החבר של ניר חפש הודעות אחרות של ניר בקר בדף הבית של ניר
 
pitbull
משתמש חבר
משתמש חבר
סמל אישי

הצטרף / הצטרפה: 14 May 2005
משתמש: מנותק/ת
הודעות: 209
נשלח בתאריך: 12 October 2005 בשעה 09:27 | IP רשוּם
ציטוט pitbull

UnderWarrior כתב:
בעיות:
1. שימוש במשתנים גלובליים
2. קריאת מחרוזת %s לתוך תו בודד (ch)
3. השמת תו למחרוזת
4. אתה עושה לולאה אבל לא משתמש בכלל במשתנה i שבה.

יש עוד המון בעיות - הקוד בכלל לא בכיוון


אוקיי תודה באמת לא שמתי לב ל %S
שיניתי עכשיו כמה דברים והפונקצייה עובדת אבל חלקית..
זה בעייה, כי מה שהתוכנית עושה, זה פשוט לקלוט מהקובץ טקסט מחרוזות באורך של הערך שמחפשים, למשל מחפשים את הערך "abc" , אז התוכנית תקלוט כל פעם [עד סוף הקובץ] מחרוזת באורך שלוש תווים ותשווה אותה ל "abc", זה יעבוד רק במקרים ספציפיים
כמו למשל עם הערך "abc" נמצא כבר על ההתחלה, אבל נגיד אם בקובץ טקסט
הטקסט יהיה: "12abc", אז התוכנית תקלוט שתי מחרוזות, המחרוזת הראשונה "12a"
המחרוזת השנייה "bc", היא תשווה כל אחת מהמחרוזות ל "abc" ואז היא תגיד שהמחרוזת לא נמצאה שזה בעצם טעות...

בקיצור, מישהו יכול לתת לי כיוון איך אני יכול למצוא מחרוזת בתוך קובץ טקסט?

חזרה לתחילת העמוד הצג את כרטיס החבר של pitbull חפש הודעות אחרות של pitbull
 
no nick.inc
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 12 October 2005 בשעה 10:22 | IP רשוּם
ציטוט no nick.inc

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

דוגמה 12abc

בקריאה ראשונה 12a קריאה שניה 2ab קריאה שלישית abc.

חזרה לתחילת העמוד הצג את כרטיס החבר של no nick.inc חפש הודעות אחרות של no nick.inc בקר בדף הבית של no nick.inc
 
אבידור
משתמש חבר
משתמש חבר
סמל אישי

הצטרף / הצטרפה: 11 October 2005
מדינה: Israel
משתמש: מנותק/ת
הודעות: 162
נשלח בתאריך: 12 October 2005 בשעה 11:12 | IP רשוּם
ציטוט אבידור

כמאט הצלחתי לתקן אותה..
קיצר שמע אין לי זמן לזה אז תנסה לבנות מחדש את הפונקציה כך ש:
תסרוק כל פעם מחדש את הקובץ ממקום כלשהוא לדוגמא
הקלדתי SS אז LENGHT=2.
בהתחלה זה מתחיל מהתחלת הקובץ אז אני עושה לולאת FOR
שסורקת את התוים ומכניסה אותם לSTR ואחכ בודקת עם לא הגענו לסוף הקובץ. לדוגמא


for(i=0;i<lenght;i++)
{
fscanf(f,"%c",&ch);
if(ch==EOF)
exit(0);
str=ch;
}
אז זה מכניס את ה LENGHT התוים הראשונים לתוך המשתנה STR.
אח"כ תבצע בדיקה עם זה שווה או לא.
ואם לא תמשיך לבדוק בקיצר תקרא את כל הקוד שאני יכתוב פה עכשיו.
נ.ב.
fseek מעביר מיקום בקובץ.
וכל פעם שקוראים תו , זה אוטומתי מעביר אותו לתו הבא.
לכן אנחנו לא צריכים את זה..


הקוד לבדיקה בערך :
(לא בטוח שיפעל)

search(0);


void search(int a)}
fseek(f,a,SEEK_CUR)
for(i=0;i<lenght;i++)
{
fscanf(f,"%c", &ch);
if(ch==EOF)
exit(1);
str=ch;
}
if(strcmp(query,str)==0)
{
printf("FOUND");
getch();
return 1;
}
else
{
fseek(f,-lenght,SEEK_CUR);
search(a+1);
}
}

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

אם ברצונך להגיב לנושא זה עליך קודם להתחבר
אם אינך רשום/ה כבר עליך להרשם

  שליחת תגובהשליחת נושא חדש
גרסת הדפסה גרסת הדפסה

קפיצה לפורום
אינך יכול/ה לשלוח נושאים חדשים בפורום זה
אינך יכול/ה להגיב לנושאים בפורום זה
אינך יכול/ה למחוק את הודעותיך ותגוביך בפורום זה
אינך יכול/ה לערוך את הודעותיך ותגובותיך בפורום זה
אינך יכול/ה לצור סקרים בפורום זה
אינך יכול/ה להצביע בסקרים בפורום זה