خواندن فایل متنی در C

shz1369

New Member
سلام دوستان،
چطور میشه یک فایل متنی که چندین خط (4 خط) اولش یک سری جملات که با هشتگ شروع میشن و در ادامه داده های عددی که بعدا در محاسبات استفاده میشوند رو باز کرد و فقط اعداد را خواند؟ به عبارتی چندین جمله اول که با هشتگ شروع میشن ، صرفا جهت اطلاع خواننده (فرد) هست و فقط اعداد مورد نیاز می باشد.

با تشکر از شما


Weather.png
 

the_king

مدیرکل انجمن
سلام دوستان،
چطور میشه یک فایل متنی که چندین خط (4 خط) اولش یک سری جملات که با هشتگ شروع میشن و در ادامه داده های عددی که بعدا در محاسبات استفاده میشوند رو باز کرد و فقط اعداد را خواند؟ به عبارتی چندین جمله اول که با هشتگ شروع میشن ، صرفا جهت اطلاع خواننده (فرد) هست و فقط اعداد مورد نیاز می باشد.

با تشکر از شما


مشاهده پیوست 114555
کاراکتر اول هر سطر رو میخونید، اگه # بود تا آخر سطر رو با fgets میخونید و اگر نبود یک کاراکتر عقب نشینی می کنید و شماره ابتدای سطر و اعداد اعشاری بعدش رو میخونید و با gets تا ابتدای سطر بعدی میخونید و مجددا روال رو تکرار می کنید.
C:
#include <stdio.h>
#include <stdlib.h>

int main () {
    int ch, n, i;
    char str[1000];
    float data[9];
    FILE * fp;
    fp = fopen ("input.txt", "r");
    while (!feof(fp))
    {
        ch = fgetc(fp);
        if (ch == '#')
        {
            fgets(str,1000,fp);
            continue;
        }
        fseek(fp,-1,SEEK_CUR);
        if (fscanf(fp, "%d", &n)!=1)
            break;
        for (i=0;(i<9)&&(fscanf(fp,"%f",&data[i])==1);i++);
        fgets(str,1000,fp);
        printf("n=%d, data[0]=%f, data[1]=%f, ..., data[8]=%f \n", n, data[0], data[1], data[8]);
    }
    fclose(fp);
    return 0;
}
 

shz1369

New Member
سلام و سپاس از لطفتون،
من کدهای شما رو کپی کردم ، اما متاسفانه در اجرا به مشکل برخوردم و به نتیجه نمیرسم. من از روی کدهای شما و دیگر منابع ، کدهایی رو نوشتم که متاسفانه اونم به نتیجه ختم نمیشه!!
من مدت کمی هست که با زبان C و کلا برنامه نویسی آشنا شدم. کدی رو که نوشتم ، رو اینجا کپی میکنم، اگر امکان داشته باشه تصحیح بفرمایید که متوجه اشکالاتم بشوم.

بسیار از لطف شما سپاسگذارم و ممنونم بابت وقتی که میگذارید!


 

پیوست ها

  • M.txt
    806 بایت · بازدیدها: 3

the_king

مدیرکل انجمن
سلام و سپاس از لطفتون،
من کدهای شما رو کپی کردم ، اما متاسفانه در اجرا به مشکل برخوردم و به نتیجه نمیرسم. من از روی کدهای شما و دیگر منابع ، کدهایی رو نوشتم که متاسفانه اونم به نتیجه ختم نمیشه!!
من مدت کمی هست که با زبان C و کلا برنامه نویسی آشنا شدم. کدی رو که نوشتم ، رو اینجا کپی میکنم، اگر امکان داشته باشه تصحیح بفرمایید که متوجه اشکالاتم بشوم.

بسیار از لطف شما سپاسگذارم و ممنونم بابت وقتی که میگذارید!


اول باید مشخص کنید که مشکل تون چیه، خطایی میده؟ مشکل از فرمت ورودی است (مثلا خواندن فایل Unicode که هر کاراکتر اش دو بایتی است، در برنامه ای به زبان قدیمی C که ورودی رو ANSI میخونه و هر کاراکتر اش یک بایت ئه) یا مشکل از کد ئه و ...
شما در کد تون همچین شرطی دارید که تا وقتی c فلان مقدار نشده به حلقه while ادامه بده :
C:
    c = fgetc(data);
    while(c != EOF){
        while(c == '#'){
        fgets(buff, 255, (FILE*)data);
مقدار c کی تعیین میشه؟ فقط یکبار و قبل از شروع حلقه while اول. آیا در حلقه while اول یا دوم مقدار جدیدی برای c تعیین میشه؟ خیر.
نتیجه اش این میشه که داخل حلقه ها هیچ اتفاقی که منجر به تغییر حالت شرط while اول یا دوم بشه رخ نمیده و هزار بار هم حلقه های تو در تو اجرا بشوند مقدار c همان مقداری میمونه که قبل از اجرای حلقه اول بود. برای همینه که این روال درست کار نخواهد کرد.

دقت کنید که lf% در نسخه های اولیه زبان C برای printf شناخته شده نیست و بعدا اضافه شده، لذا "printf("%lf الزاما در همه کامپایلر ها درست کار نخواهد کرد، f% از این لحاظ مطمئن تر است :
C:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

FILE *data;
char c;
int i;
char buff[255];
double Mon[13],temp[13],N[13],NO[13],O[13],SO[13],S[13],SW[13],W[13],NW[13];

int main()
{
    data = fopen( "input.txt", "r" );
    if(data == NULL)
    {
        printf("ERROR!");
        return 1;
    }
    i = 0;
    do
    {
        c = fgetc(data);
        if (c == EOF)
        {
            break;
        }
        if (c != '#')
        {
            i++;
            fseek(data,-1,SEEK_CUR);
            fscanf(data, "%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf", &Mon[i], &temp[i], &N[i], &NO[i],&O[i],&SO[i],&S[i],&SW[i],&W[i],&NW[i]);
        }
        fgets(buff, 255, (FILE*)data);
    } while (1);
    fclose(data);
    printf("%f", Mon[3]); // For Example
    return 0;
}
 

shz1369

New Member
سلام،
قبل از هز چیز باید ازتون تشکر کنم بابت راهنماییاتون و امیدوارم که بهترین ها واستون اتفاق بیفته.
کاملا درسته. من مشکلاتم رو متوجه شدم. ممنونم.

مجددا کد شما رو اجرا کردم اما به یک روند بی انتها میرسم. من به کدهای شما، دستور پرینت رو بعد از fscanf وارد کردم و عملیات چاپ بی پایان انجام میشد.
از سمت دیگه، طبق راهنمایی های شما کدهای خودم رو تغییر دادم که از این طریق متاسفانه به جای اعدادی که تو فایل هست ، فقط صفر چاپ میشه.

به پیوست مجدد کدهای شما که دستور پرینت رو اضافه کردم به اسم Modir و کدهای خودم به اسم Saeed و نتیجه بصورت فایل عکس خدمتتان ارسال میشود.


مجدد بسیار سپاسگزارم از لطفتون.
 

پیوست ها

  • Modir.txt
    919 بایت · بازدیدها: 1
  • Saeed.txt
    892 بایت · بازدیدها: 1
  • My.png
    My.png
    39.5 کیلوبایت · بازدیدها: 2

the_king

مدیرکل انجمن
سلام،
قبل از هز چیز باید ازتون تشکر کنم بابت راهنماییاتون و امیدوارم که بهترین ها واستون اتفاق بیفته.
کاملا درسته. من مشکلاتم رو متوجه شدم. ممنونم.

مجددا کد شما رو اجرا کردم اما به یک روند بی انتها میرسم. من به کدهای شما، دستور پرینت رو بعد از fscanf وارد کردم و عملیات چاپ بی پایان انجام میشد.
از سمت دیگه، طبق راهنمایی های شما کدهای خودم رو تغییر دادم که از این طریق متاسفانه به جای اعدادی که تو فایل هست ، فقط صفر چاپ میشه.

به پیوست مجدد کدهای شما که دستور پرینت رو اضافه کردم به اسم Modir و کدهای خودم به اسم Saeed و نتیجه بصورت فایل عکس خدمتتان ارسال میشود.


مجدد بسیار سپاسگزارم از لطفتون.
کدی که خودتون نوشتید همچنان منطق درستی نداره اما اگر با کدی که من نوشتم مشکلی هست باید ایراد از فرمت فایل ورودی باشه.
اون فایل متنی txt ورودی رو با Notepad یا Microsoft Word باز کنید و موقع Save As کردن در همون فایل یکی از Encoding های ANSI یا US-ASCII یا MS-DOS را بکار ببرید و از Unicode و UTF-8 اجتناب کنید.
 

shz1369

New Member
چقدر جالب بود واسم. با Notepad و فرمت ANSI ذخیره کردم، اما باز شد. اما با Microsoft Word که امتحان کردم، جواب داد. عالی، ممنونم از شما. علت این رو متوجه نشدم، چون واقعا پیش زمینه معلوماتی ندارم تو این زمینه.
واقعا لذت بردم از پاسخگویی شما و سعی میکنم سایت شما رو به مابقی دوستان هم معرفی کنم.

البته هنوز تو این سایت سوال خواهم پرسید و از اطلاعات شما کمک خواهم گرفت. :)
 

the_king

مدیرکل انجمن
چقدر جالب بود واسم. با Notepad و فرمت ANSI ذخیره کردم، اما باز شد. اما با Microsoft Word که امتحان کردم، جواب داد. عالی، ممنونم از شما. علت این رو متوجه نشدم، چون واقعا پیش زمینه معلوماتی ندارم تو این زمینه.
واقعا لذت بردم از پاسخگویی شما و سعی میکنم سایت شما رو به مابقی دوستان هم معرفی کنم.

البته هنوز تو این سایت سوال خواهم پرسید و از اطلاعات شما کمک خواهم گرفت. :)
همانطور که پست دوم ام گفتم مشکل از فرمت ورودی است. زمانی که زبان C و کاراکتر و رشته و ... اش حدودا 50 سال پیش طراحی میشد، استاندارد Unicode و UTF-8 و ... هنوز ابداع نشده نبودند و در فایل متنی هر کاراکتر صرفا یک بایت بود. برای همین این روال ها در یک زبان قدیمی برای خواندن Encoding هایی که حدود 20 سال بعد ابداع شدند و هر کاراکتر شان چند بایتی است آمادگی ندارند و ورودی رو با روش اشتباهی می خوانند.
 

جدیدترین ارسال ها

بالا