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

کمک و پشتیبانی => برنامه‌سازی => نویسنده: Arthur Scherbius در 04 خرداد 1399، 08:58 ب‌ظ

عنوان: پیدا نکردن سایز فایل ها در C
ارسال شده توسط: Arthur Scherbius در 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 هم تستش کردم هر تابعی که بلد بودم نوشتم همشون این ارورو می دن
عنوان: پاسخ : پیدا نکردن سایز فایل ها در C
ارسال شده توسط: هومان در 04 خرداد 1399، 10:44 ب‌ظ
خب من فکر کنم این مربوط به libc باشه
یه دور reinstall ش کن ببین چی میشه

پ.ن:شاید اشتباه باشه ایده ام و اثر نزاره
عنوان: پاسخ : پیدا نکردن سایز فایل ها در C
ارسال شده توسط: esmaeelE در 04 خرداد 1399، 11:56 ب‌ظ
پیشنهاد می‌کنم برای سوالات برنامه نویسی کد به همراه خروجی کاملی از برنامه را قرار دهید.
در اینجا لازمه که نحوه فراخوانی برنامه برای اجرا، ورودی‌ها و خروجی آن کاملا مشخص باشد.

سوال خوب بپرسید (https://wiki.ubuntu.ir/wiki/Smart_Questions) تا پاسخ خوب بگیرید.

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

مقدار بازگشتی از 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 استفاده کنید.

https://www.geeksforgeeks.org/error-handling-c-programs/

پاسخ‌های دیگر را نیز بررسی کنید.
https://stackoverflow.com/questions/238603/how-can-i-get-a-files-size-in-c

عنوان: پاسخ : پیدا نکردن سایز فایل ها در C
ارسال شده توسط: nixoeen در 05 خرداد 1399، 12:29 ق‌ظ
#include <sys/stat.h>
struct stat st;
stat(filename, &st);
size = st.st_size;
عنوان: پاسخ : پیدا نکردن سایز فایل ها در C
ارسال شده توسط: Arthur Scherbius در 05 خرداد 1399، 06:23 ق‌ظ
پیشنهاد می‌کنم برای سوالات برنامه نویسی کد به همراه خروجی کاملی از برنامه را قرار دهید.
در اینجا لازمه که نحوه فراخوانی برنامه برای اجرا، ورودی‌ها و خروجی آن کاملا مشخص باشد.

سوال خوب بپرسید (https://wiki.ubuntu.ir/wiki/Smart_Questions) تا پاسخ خوب بگیرید.

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

مقدار بازگشتی از 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 استفاده کنید.

https://www.geeksforgeeks.org/error-handling-c-programs/

پاسخ‌های دیگر را نیز بررسی کنید.
https://stackoverflow.com/questions/238603/how-can-i-get-a-files-size-in-c



متاسفانه به دلیل بزرگ بودن سورس کد نمی تونم کدم رو این جا بذارم ولی با دیباگر برسی کردم قبلا یه تابع نوشته بودم که اگه فایل وجود نداشت بگه مسیر فایل اشتباهه و دوباره فایلو بخواد اگه مسیر اشتباهی بدم برنامه درست کار می کنه و دوباره ورودی می خواد اما اگه فایل وجود داشته باشه برنامه میره تا تابع یا روشی که سایز فایل رو می شه پیدا کرد اجرا می کنه اون موقع موقع خوندن فایل ارور می ده مطمعنم که مشکل از لینوکسه چون توی هر سیستم عاملی تست کردم درست کار می کرد
عنوان: پاسخ : پیدا نکردن سایز فایل ها در C
ارسال شده توسط: Arthur Scherbius در 05 خرداد 1399، 06:25 ق‌ظ
#include <sys/stat.h>
struct stat st;
stat(filename, &st);
size = st.st_size;
اینم قبلا تست کردم بازم همون ارورو می ده
عنوان: پاسخ : پیدا نکردن سایز فایل ها در C
ارسال شده توسط: Arthur Scherbius در 05 خرداد 1399، 06:38 ق‌ظ
خب من فکر کنم این مربوط به libc باشه
یه دور reinstall ش کن ببین چی میشه

پ.ن:شاید اشتباه باشه ایده ام و اثر نزاره
ممنون! اولش روشت کار نکرد بعد ریبوت سیستم درست شد واقعا متشکرم
عنوان: پاسخ : پیدا نکردن سایز فایل ها در C
ارسال شده توسط: هومان در 05 خرداد 1399، 02:14 ب‌ظ
خب من فکر کنم این مربوط به libc باشه
یه دور reinstall ش کن ببین چی میشه

پ.ن:شاید اشتباه باشه ایده ام و اثر نزاره
ممنون! اولش روشت کار نکرد بعد ریبوت سیستم درست شد واقعا متشکرم
من خودم سی بلد نیستم خیلی(در حد بیسیک اینای سینتکس )
اینم یه حدس بود که بعید میدونستم اثر گذار باشه
خوشحالم کار کرد
عنوان: پاسخ : پیدا نکردن سایز فایل ها در C
ارسال شده توسط: alend در 05 خرداد 1399، 03:50 ب‌ظ
کد روی اوبونتو ۲۰ با کرنل 5.4.0-31-generic  به درستی کامپایل شد.

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

https://en.cppreference.com/w/cpp/filesystem/file_size
 (https://en.cppreference.com/w/cpp/filesystem/file_size)
عنوان: پاسخ : پیدا نکردن سایز فایل ها در C
ارسال شده توسط: alend در 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 (https://stackoverflow.com/questions/238603/how-can-i-get-a-files-size-in-c)