קריאת מספרים שלמים בלבד מקובץ (בשפת C)

קריאת מספרים שלמים בלבד מקובץ (בשפת C)

נניח יש לי קובץ שכולל את התוכן הבא :
(100,20),(15,1),(200,48)

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

BravoMan

Active member
תלוי:

אם אתה יודע שהמספרים שאתה רוצה לקרוא נמצאים במקומות מאוד ספציפיים בקובץ - למשל, מספר מתחיל בבית 2 ונגמר בבית 4, תוכל לקרוא רק את המספרים.
&nbsp
אם אתה לא יודע, תצטרך לקרוא הכל, ולסנן את המספרים אחרי שקראת, או תוך כדי הקריאה.
&nbsp
fscanf יכולה לעזור אם אתה יודע אפה מתחיל כל מספר.
 
אז אשמח אם תדגים לי את קריאת ה-intים בעזרת הדוגמה הבאה:

נניח שהקובץ שלי כולל שתי שורות כאלו:
4
(100,20),(15,1),(200,48)​
 

eyalbd

New member
אפשר לקרוא עם fscanf

הדרך כזאת:
1. קרא תו תו
2. אם התו EOF צא מהלולאה
3. אם התו הוא ספרה החזר אותו ל-stream ע"י ungetc
4. קרא את המספר ע"י fscanf
5. הדפס את המספר
6. חזור ל1.

יש חיסרון לשיטה - קלט של ספרות שיגרמו לoverflow
 

selalerer

New member
בטח שאפשר

קוד:
FILE* file = fopen("file.txt", "r");
if (0 == file)
{
    fprintf(stderr, "Failed to open file file.txt\n");
    exit(1);
}

int result;
do 
{
    int x, y;
    result = fscanf(file, "(%d,%d)", &x, &y);
  
    if (result < 2)
    {
        fprintf(stderr, "Failed to read two numbers in format (x,y) from the file\n");
        exit(1);
    }

    printf("Read x=%d, y=%d\n", x, y);

    result = fscanf(file, ",");
}while (1 == result);
 

eyalbd

New member
אני התכוונתי לקוד הבא:

קוד:
void read_numbers_scanf(FILE* fp)
{
    int c;
    long number;

    printf("Read by fscanf:\n");

    while ((c = fgetc(fp)) != EOF) {
        if (!isdigit(c))
            continue;
        ungetc(c, fp);
        if (fscanf(fp, "%ld", &number) > 0)
            printf("Number is %ld\n", number);
    }
    printf("\n");
}
 

eyalbd

New member
ובאופן דומה עם iostreams

קוד:
void read_numbers_istream(std::istream& in)
{
    using namespace std;

    char c;
    long number;

    cout << "Read by iostreams:" << endl;

    while (in.get(c)) {
        if (!isdigit(c))
            continue;
        in.putback(c);
        if (in >> number)
            cout << "Number is " << number << endl;
    }

    cout << "\n\n";
}
 
למעלה