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

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

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


ارائه ۲۴٫۱۰ اوبونتو منتشر شد 🎉

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

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

آفلاین Arthur Scherbius

  • Jr. Member
  • *
  • ارسال: 89
پیدا نکردن سایز فایل ها در 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
  • *
  • ارسال: 1527
  • جنسیت : پسر
  • آرچ + گنوم
پاسخ : پیدا نکردن سایز فایل ها در C
« پاسخ #1 : 04 خرداد 1399، 10:44 ب‌ظ »
خب من فکر کنم این مربوط به libc باشه
یه دور reinstall ش کن ببین چی میشه

پ.ن:شاید اشتباه باشه ایده ام و اثر نزاره

آفلاین esmaeelE

  • ناظر انجمن
  • *
  • ارسال: 1269
  • جنسیت : پسر
پاسخ : پیدا نکردن سایز فایل ها در 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

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

آفلاین Arthur Scherbius

  • Jr. Member
  • *
  • ارسال: 89
پاسخ : پیدا نکردن سایز فایل ها در 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 استفاده کنید.


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



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

آفلاین Arthur Scherbius

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

آفلاین Arthur Scherbius

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

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

آفلاین هومان

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

پ.ن:شاید اشتباه باشه ایده ام و اثر نزاره
ممنون! اولش روشت کار نکرد بعد ریبوت سیستم درست شد واقعا متشکرم
من خودم سی بلد نیستم خیلی(در حد بیسیک اینای سینتکس )
اینم یه حدس بود که بعید میدونستم اثر گذار باشه
خوشحالم کار کرد

آفلاین alend

  • High Hero Member
  • *
  • ارسال: 1319
پاسخ : پیدا نکردن سایز فایل ها در 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
  • *
  • ارسال: 1319
پاسخ : پیدا نکردن سایز فایل ها در 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