انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید

اوبونتو ۲۰.۰۴ منتشر شد.
انتظار می‌ره همهٔ اعضا هرچه زودتر به این نگارش ارتقا پیدا کنند. همهٔ پاسخ‌ها از این به بعد، بر پایهٔ اوبونتو ۲۰.۰۴ خواهد بود.

نویسنده موضوع: پیدا نکردن سایز فایل ها در C  (دفعات بازدید: 416 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین Hukei

  • Jr. Member
  • *
  • ارسال: 36
پیدا نکردن سایز فایل ها در C
« : 04 خرداد 1399، 08:58 ب‌ظ »
بعد اپدیت کرنل متوجه شدم که یکی از برنامه هایی که با C نوشتم مدام invalid pointer می ده متوجه شدم مشکل از این تابعه که سایز یه فایلی رو پیدا می کنه long int findsize(char file_name[])
{
    FILE* fp = fopen(file_name, "r");

    fseek(fp, 0L, SEEK_END);

    long int res = ftell(fp);

    fclose(fp);

    return res;
}

این کد تو لینوکس قبلی درست کار می کرد با کامپایلر انلاین هم تست کردم درست کار می کنه روی FreeBSD هم تستش کردم هر تابعی که بلد بودم نوشتم همشون این ارورو می دن

آفلاین هومان

  • High Hero Member
  • *
  • ارسال: 1262
  • جنسیت : پسر
  • returned to the void
پاسخ : پیدا نکردن سایز فایل ها در C
« پاسخ #1 : 04 خرداد 1399، 10:44 ب‌ظ »
خب من فکر کنم این مربوط به libc باشه
یه دور reinstall ش کن ببین چی میشه

پ.ن:شاید اشتباه باشه ایده ام و اثر نزاره
If you don't want chains on you hand and foot, your only escape is to switch to a free operating system

آفلاین esmaeelE

  • Sr. Member
  • *
  • ارسال: 386
  • جنسیت : پسر
پاسخ : پیدا نکردن سایز فایل ها در C
« پاسخ #2 : 04 خرداد 1399، 11:56 ب‌ظ »
پیشنهاد می‌کنم برای سوالات برنامه نویسی کد به همراه خروجی کاملی از برنامه را قرار دهید.
در اینجا لازمه که نحوه فراخوانی برنامه برای اجرا، ورودی‌ها و خروجی آن کاملا مشخص باشد.

سوال خوب بپرسید تا پاسخ خوب بگیرید.

اما تا اینجای کار می‌توانید تغییرات زیر را اعمال کنید.

مقدار بازگشتی از fopen را بررسی کنید که NULL نباشد. مقدار NULL نشاندهنده عدم موفقیت باز کردن فایل است و در این‌صورت گام‌های بعدی نامعتبر است.
FILE* fp = fopen(file_name, "r");
if (fp){
        printf("Error in opening file\n");
        return;
}

مقدار بازگشتی fseek هم در صورت موفقیت باید 0 باشد. همچنین برای ftel هم بررسی کنید.

قسمتی از man fseek
RETURN VALUE
       The rewind() function returns no value.  Upon successful  completion,  fgetpos(),  fseek(),
       fsetpos()  return 0, and ftell() returns the current offset.  Otherwise, -1 is returned and
       errno is set to indicate the error.


برای چاپ بیشتر اطلاعات در مورد خطای رخ داده می‌توانید از هدر errno.h استفاده کنید.


پاسخ‌های دیگر را نیز بررسی کنید.


آفلاین nixoeen

  • ناظر انجمن
  • *
  • ارسال: 4063
  • جنسیت : پسر
  • masoft قدیم
پاسخ : پیدا نکردن سایز فایل ها در C
« پاسخ #3 : 05 خرداد 1399، 12:29 ق‌ظ »
#include <sys/stat.h>
struct stat st;
stat(filename, &st);
size = st.st_size;

آفلاین Hukei

  • Jr. Member
  • *
  • ارسال: 36
پاسخ : پیدا نکردن سایز فایل ها در C
« پاسخ #4 : 05 خرداد 1399، 06:23 ق‌ظ »
پیشنهاد می‌کنم برای سوالات برنامه نویسی کد به همراه خروجی کاملی از برنامه را قرار دهید.
در اینجا لازمه که نحوه فراخوانی برنامه برای اجرا، ورودی‌ها و خروجی آن کاملا مشخص باشد.

سوال خوب بپرسید تا پاسخ خوب بگیرید.

اما تا اینجای کار می‌توانید تغییرات زیر را اعمال کنید.

مقدار بازگشتی از fopen را بررسی کنید که NULL نباشد. مقدار NULL نشاندهنده عدم موفقیت باز کردن فایل است و در این‌صورت گام‌های بعدی نامعتبر است.
FILE* fp = fopen(file_name, "r");
if (fp){
        printf("Error in opening file\n");
        return;
}

مقدار بازگشتی fseek هم در صورت موفقیت باید 0 باشد. همچنین برای ftel هم بررسی کنید.

قسمتی از man fseek
RETURN VALUE
       The rewind() function returns no value.  Upon successful  completion,  fgetpos(),  fseek(),
       fsetpos()  return 0, and ftell() returns the current offset.  Otherwise, -1 is returned and
       errno is set to indicate the error.


برای چاپ بیشتر اطلاعات در مورد خطای رخ داده می‌توانید از هدر errno.h استفاده کنید.


پاسخ‌های دیگر را نیز بررسی کنید.



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

آفلاین Hukei

  • Jr. Member
  • *
  • ارسال: 36
پاسخ : پیدا نکردن سایز فایل ها در C
« پاسخ #5 : 05 خرداد 1399، 06:25 ق‌ظ »
#include <sys/stat.h>
struct stat st;
stat(filename, &st);
size = st.st_size;
اینم قبلا تست کردم بازم همون ارورو می ده

آفلاین Hukei

  • Jr. Member
  • *
  • ارسال: 36
پاسخ : پیدا نکردن سایز فایل ها در C
« پاسخ #6 : 05 خرداد 1399، 06:38 ق‌ظ »
خب من فکر کنم این مربوط به libc باشه
یه دور reinstall ش کن ببین چی میشه

پ.ن:شاید اشتباه باشه ایده ام و اثر نزاره
ممنون! اولش روشت کار نکرد بعد ریبوت سیستم درست شد واقعا متشکرم

آفلاین هومان

  • High Hero Member
  • *
  • ارسال: 1262
  • جنسیت : پسر
  • returned to the void
پاسخ : پیدا نکردن سایز فایل ها در C
« پاسخ #7 : 05 خرداد 1399، 02:14 ب‌ظ »
خب من فکر کنم این مربوط به libc باشه
یه دور reinstall ش کن ببین چی میشه

پ.ن:شاید اشتباه باشه ایده ام و اثر نزاره
ممنون! اولش روشت کار نکرد بعد ریبوت سیستم درست شد واقعا متشکرم
من خودم سی بلد نیستم خیلی(در حد بیسیک اینای سینتکس )
اینم یه حدس بود که بعید میدونستم اثر گذار باشه
خوشحالم کار کرد
If you don't want chains on you hand and foot, your only escape is to switch to a free operating system

آنلاین alend

  • High Hero Member
  • *
  • ارسال: 1181
پاسخ : پیدا نکردن سایز فایل ها در C
« پاسخ #8 : 05 خرداد 1399، 03:50 ب‌ظ »
کد روی اوبونتو ۲۰ با کرنل 5.4.0-31-generic  به درستی کامپایل شد.

برای استاندارد ۱۷ سی پلاس پلاس می تونید از کتابخانه رسمی استفاده کنید:

https://en.cppreference.com/w/cpp/filesystem/file_size
« آخرین ویرایش: 05 خرداد 1399، 04:01 ب‌ظ توسط alend »

آنلاین alend

  • High Hero Member
  • *
  • ارسال: 1181
پاسخ : پیدا نکردن سایز فایل ها در C
« پاسخ #9 : 05 خرداد 1399، 03:57 ب‌ظ »
#include <sys/stat.h>
struct stat st;
stat(filename, &st);
size = st.st_size;

nixoeen جان بهتر نبود  منبع را هم می گذاشتید:

https://stackoverflow.com/questions/238603/how-can-i-get-a-files-size-in-c