الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشاكل في كود خاص بالملفات واستفسارات اخرى

بدأه yousefal في 20 فبراير 2012 · 16 رد · 549 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم لدي الكود الاتي ..

#include <stdio.h>
#include <stdlib.h>

int main()
{   int Id;
    char name[255];
    char Title[255];
    float avg;
     printf("please,Enter the complete path for file  you want to read data from it.\n");
     gets(Title);
     FILE*inp;
     inp=fopen("Title","r");
     while((inp=fopen("Title","r"))==NULL)
   {
       printf("please,Enter the right path for the file");
       inp=fopen("Title","r");
   }
   //sentance to read from file
fscanf(inp,"%d",Id);
fgets(inp,"%s",name);
fscanf(inp,"%f",avg);
printf("%d\n%s%f",Id,name,avg);  inp=fopen("Title","r");
 // pre sentance to print what we write
   fclose(inp);
    return 0 ;
}

حين عمل الcompiler له لا يظهر اخطاء وانما

wearnings و notes علما باني استخدم ال codblockes.... وحين التنفيذ تظهر سلسلة لا متناهية تطلب مني ادخال العنوان الصحيح ، فكيف يكون ادخاله ان كنت اخطات فيه

استفسارات اخرى ..

#حين نعرف مصفوفة من نوع نص ما هو الحد الاقصى هل هنالك امكانية لان تكون اكبر من 256

#توضيع الاقتران gets &fgets & fread مع الparameter خاصتهم

ماذا بخصوص الكتابة :: هل يتشابه الامر؟؟

#2

تفضل أخى محاوتك بعد التعديل :

/* 
 * File:   main.c
 * Author: Mohammed Abu Zayed
 * 
 * Created on February 20, 2012, 10:19 PM
 */

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int Id;
    char name[255];
    char Title[255];
    float avg;
    FILE *inp;
    inp = fopen(Title, "r");
    do  {
        printf("please,Enter the complete path\nfor file  you want to read data from it: ");
        gets(Title);        
    }while(!(inp = fopen(Title, "r")));

    //sentance to read from file
    fscanf(inp, "%d", Id);
    fgets(inp, "%s", name);
    fscanf(inp, "%f", avg);
    printf("%d\n%s%f", Id, name, avg);
    inp = fopen("Title", "r");
    // pre sentance to print what we write
    fclose(inp);
    return (EXIT_SUCCESS);
}

أم باقى اﻻسئلة فليتفضل زملائى اﻻخرون باﻻجابة عليها

تم تعديل هذه المشاركة بواسطة محمد ابوزايد في 21 فبراير 2012 في 11:41

1

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#3
اقتباس
حين نعرف مصفوفة من نوع نص ما هو الحد الاقصى هل هنالك امكانية لان تكون اكبر من 256

و لماذا من الــ 256 ؟؟ :)

حسب فهمي فإن الأمر يتعلق بطبيعة حجز المصفوفة (مكان تخزينها), هل هو stack أم الــ heap ؟

إذا قمنا بالإعلان عن المصفوفة هكذا :

char *str = STR;

حيث STR تشير الى سلسلة نصية كبيرة .

فإن الـ Standards تقول حسب علمي انه لابد لمترجم السي ان يقبل سلسلة نصية بطول 509 حرف، المترجمات ربما تزيد عن ذلك لكن لا تقل ابدا.

فمثلا مترجم مايكروسوفت يقبل حتى 2048 حرف في السلسلة الواحدة .

بالتوفيق.

#4

الله يبارك فيكم جميعا .. الأخ محمد ابو زايد .. يا ريت لو شوية توضيح على التعديلات اللي قمت فيها .. وهل كان الكود خاصتي خاطىء؟

الاخ خالد انا اتحدث عن نصوص لتكون عناوين لملفات سيتم القراءة منها او الكتابة عليها .. او نصوص سيتم قرائتها او تخزينها على الملفات (txt( وما زلت مبتدئا ولا اميز لا heap ولا stack

شكرا لكم

#5

السلام عليكم

من فضلك, لا توجه السؤال إلى عضو بعينه مهما كانه وزنه في المنتدى :) لأنك بهذا الفعل تحرم نفسك من إجابات بقية الأعضاء.

سأجبيك, إلى أن يأتي أستاذنا محمد أبو زايد ليُصحح لنا الأخطاء.

اقتباس
أنا اتحدث عن نصوص لتكون عناوين لملفات سيتم القراءة منها او الكتابة عليها .. او نصوص سيتم قرائتها او تخزينها على الملفات txt

عفوا, كنت أظنك تتحدث عن طول السلسلة الحرفية التي يمكننا إسنادها إلى مؤشر حرفي.

بالنسبة لسؤالك فاسم الملف في الويندوز يجب أن لا يتعدى 260 حرف. انظر هنا :

اقتباس

Quelle est la longueur maximale d’un nom de fichier ?

Windows limite généralement les noms de fichiers à 260 caractères. Toutefois, le nom de fichier se doit dans la réalité d’être plus court car le chemin d’accès complet (tel que C:\Program Files\nomfichier.txt) est compris dans ce compte de caractères. Ceci explique pourquoi, de temps à autre, une erreur peut éventuellement se produire lorsque vous copiez un fichier avec un nom très long dans un emplacement dont le chemin d’accès est plus long que celui de l’emplacement actuel.

للمزيد :

اقتباس
هل كان الكود خاصتي خاطىء ؟

نعم, الكود يحتوي على عدة أخطاء و أغلبها ينحصر في هذه الفقرة :

inp=fopen("Title","r");
while((inp=fopen("Title","r"))==NULL)
{
   printf("please,Enter the right path for the file");
   inp=fopen("Title","r");
}

المستخدم قام بإدخال عنوان الملف و تم تخزينه في المصفوفة Title لكنك استعملت الدالة fopen مع ملف آخر عنوانه ثابت وهو Title !, هناك فرق بين الكتابتين :

"Title" 
AND
char Title[255]

الكتابة الأولى تعني مصفوفة حرفية ثابتة تحتوي على الكلمة Title أما الكتابة الثانية فهي عبارة عن مصفوفة حرفية سعتها 254 حرف (الخانة الأخيرة يجب أن تحتوي على \0)

هناك خطأ آخر يتعلق بطريقة كتابة الدالة fgets :

fgets(inp,"%s",name);

هناك سوء ترتيب لوسائط الدالة fgets, للتوضيح أكثر :

الدالة fgets مُختصرة من file get string و هي من دوال الملف الرأسي stdio.h و لها 3 وسائط, الأول هو اسم السلسلة الحرفية و الثاني هو حجم السلسة أما الثالث فهو مؤشر لملف الإدخال FILE *inp , تقوم هذه الدالة بقراة الملف حرفا حرفا و تضع كل حرف في الوسيط الأول (السلسلة الحرفية). تتوقف fgets عن العمل عندما تصل إلى نهاية السلسلة أو نهاية الملف.

بعض الأخطاء وقع بها الأخ محمد أبو زايد سهوا.

بالتوفيق.

تم تعديل هذه المشاركة بواسطة khaled_prg في 21 فبراير 2012 في 22:03

1
#6

انا اعتذر اخي لم اقصد شيئا ... والسؤال معمم للجميع وشكرا لكل من ساعد ولكل من نوى ولكل من يستفيد .. كل ما في الأمر انكم انتم من اجبتم فوجهت سؤال التغذية الراجعة مرفقة باسمائكم ... على الرحب والسعة

#8

للاسف لم ينجح تنفيذ البرنامج ... والصورة في الاسفل توضح الخطأ . ... لكن مع ذلك انا لم افهم الجملة التابعة لكلمة DO

281408535.jpg

#9

لدي هذا الكود واتمنى معرفة ما فيه من اخطاء واتمنى الا تكون هذه مشاركة مخالفة ..

#include <stdio.h>
#include <stdlib.h>
typedef struct {
int day;
float av;
struct node *next;}student;
int main()
{student *head,*n,*k;
head=(student*)malloc(sizeof(student));
printf("give me day & av");
scanf(" %d%f",head->day,head->av);

printf("do u want to enter new value :yes press yes ,,other press any key");
char x[255]  ;


while(x=='yes')//ربما نقوم بدور مرادف من خلال استخدام اقترانات النصية
{printf("give me day &av");
scanf(" %d%f",n->day,n->av);
n->next=head;
head=n;
    //قم بالتالي:اضف نود جديدة واربطها لتسبق ما قبلها ثم اظهر جملة الطباعة
    printf("do u want to enter new value :yes press yes ,,other press any key");
}

//ما تبقى من حالات حين يرفض ادخال نود جديدة نطلب منه طباعة كل النود الموجود

k=head;
while(k!=NULL)
{
     printf("%d%f",k->day,k->av);
  k=k->next;
}
    return 0;
}
#10

خذ منى هذا الرد بشكل مؤقت وليس بشكل نهائى تدبرة الى حين اضيف فية بعد التعليل ﻻنة يحتاج منى وقت:

#include <stdio.h>
//#include <stdlib.h>

typedef struct
{
    int day;
    float av;
    struct node *next;
} student;

int main()
{
    student *head = NULL,*Current = NULL, *LastNode = NULL, *NewNode = NULL;
    printf("Do u want to enter new Student\nData yes(Y,y) no press any key: ");
    char ch ;
    ch = getchar();

    while(ch == 'y')
    {
        NewNode = (student*)malloc(sizeof(student));
        printf("Enter Day and Av:\nlike: 22:45.5 or 30:22.00\nThen press Enter ..: ");
        scanf("%d%f", NewNode->day, NewNode->av);

        NewNode->next = NULL;
        if(head == NULL)
        {
            head = NewNode;
            LastNode = head;
        }
        else
        {
            LastNode->next = NewNode;
            LastNode = NewNode;
        }
        printf("do u want to enter new value :yes press yes ,,other press any key");
        ch = getchar();
    }

    Current = head;
    while(Current != NULL)
    {
        printf("%d%f\n", Current->day, Current->av);
        Current = Current->next;
    }
    return 0;
}

تقبل مرورى والله ولى التوفيق .... .

تم تعديل هذه المشاركة بواسطة محمد ابوزايد في 23 فبراير 2012 في 10:16

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#11

السلام عليكم ورحمة الله وبركاته

لى تعليق بسيط على الكود وهو تعريف التركيب هكذا :

typedef struct
{
    int day;
    float av;
    struct node *next;
} student;

من أين للتركيب أن يتعرف على أنك تريد تعريف متغير من نوع التركيب نفسه فهذه تتم عن طريق طريقة التعريف القياسية للتركيب من خلال اسمه لأنك أنشأت التركيب وتريد تعريف مؤشر من نوعه أثناء تعريفه.

فيجب عليك فى هذه الحالة وضع اسم للتركيب وعدم إستخدام الصورة المختصره.

فمن أين لك بالمتغير node إذاً .

فضع تعريف التركيب على الصورة :

struct node
{
    int day;
    float av;
    struct node *next;
};
typedef struct node student;

أو ضعه على الصوره التى كتبته بها ولكن لاتغفل عن اسم التركيب فى هذه الحالة كما يلى :

typedef struct node
{
    int day;
    float av;
    struct node *next;
} student;

تم تعديل هذه المشاركة بواسطة ahmedsaoud31 في 23 فبراير 2012 في 10:44

1

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#12

مرحبا أخي يوسف :)

اقتباس
للاسف لم ينجح تنفيذ البرنامج ...

الخطأ الأساسي كان يكمن في كتابة الدالة fscanf لأننا لم نرسل عناوين المتغيرين Id و avg.

الدالة fscanf مُختصرة من file scan file و هي خاصة بأخذ البيانات من الملفات, تستقبل هذه الدالة 3 وسائط, مؤشر لملف الإدخال و نوعية البيانات المُراد قراءتها و عنوان المتغير الذي ستُخزن فيه البيانات المقروءة.

و هذا الكود بعد التعديل :

#include <stdio.h>
#include <stdlib.h>

int main() {
    int Id;
    float avg;
    char name[255], Title[255];
    FILE *inp;
    do {
        printf("please,Enter the complete path\nfor file  you want to read data from it: ");
        gets(Title);
    } while (!(inp = fopen(Title, "r")));
    fscanf(inp, "%d", &Id);
    fgets(name, 11, inp);
    fscanf(inp, "%f", &avg);
    printf("Id = %d\nName = %s\nAvg = %f", Id, name, avg);
    fclose(inp);
    return 0;
}

و هذه صورة لتنفيذ الكود :

post-225348-089254200 1329985740_thumb.p

اقتباس
لدي هذا الكود واتمنى معرفة ما فيه من اخطاء واتمنى الا تكون هذه مشاركة مخالفة ..

مشاركة مخالفة أخي يوسف :)

لا يجوز طرح أكثر من سؤال في نفس الموضوع. ضع سؤالك الثاني في موضوع مستقل و ستجد الإجابة إن شاء الله.

نرجو من الأعضاء الكرام احترام قوانين المنتدى لكي تسير الأمور على مسارها الطبيعي و شكرا. :happy:

سلامي.

المرفقات
File_inp.png

تم تعديل هذه المشاركة بواسطة khaled_prg في 23 فبراير 2012 في 11:31

#13
اقتباس
مشاركة مخالفة أخي يوسف :)

لا يجوز طرح أكثر من سؤال في نفس الموضوع. ضع سؤالك الثاني في موضوع مستقل و ستجد الإجابة إن شاء الله.

نرجو من الأعضاء الكرام احترام قوانين المنتدى لكي تسير الأمور على مسارها الطبيعي و شكرا. :happy:

كده هتزعلنى منك أستاذ خالد :huh: إنت كده بتفكرنى بالمشرفين وتدخلهم الزايد عن الحد فى مشاركات الأعضاء ناهيك عن والقيود والأحكام شكلنا قاعدين فى سجن "أبو زعبل هنا" :D .

يدخل الواحد منهم يقول على سان حالهم " موضوع مخالف ... يغلق الموضوع ... إن تكرر هذا الأمر فسترى ماذا سنفعل بك " :D

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#14
اقتباس
كده هتزعلنى منك أستاذ خالد :huh: إنت كده بتفكرنى بالمشرفين وتدخلهم الزايد عن الحد فى مشاركات الأعضاء ناهيك عن والقيود والأحكام شكلنا قاعدين فى سجن "أبو زعبل هنا" :D .

يدخل الواحد منهم يقول على سان حالهم " موضوع مخالف ... يغلق الموضوع ... إن تكرر هذا الأمر فسترى ماذا سنفعل بك " :D

وطي صوتك قبل ما يسمعوك يا صاحبي :D

....

عموما, إذا كان كل موضوع يحتوي على سؤال واحد فهذا سيعين قارئ الموضوع على فهم الإجابة بشكل سريع :wink:

و إلا فستكون هناك شخبطات .. و لخبطات .. و ما إلى ذلك !!, فهمتني ؟ :D

#15
اقتباس

عموما, إذا كان كل موضوع يحتوي على سؤال واحد فهذا سيعين قارئ الموضوع على فهم الإجابة بشكل سريع :wink:

و إلا فستكون هناك شخبطات .. و لخبطات .. و ما إلى ذلك !!, فهمتني ؟ :D

فعلاً كلامك مظبوط حتى يتفيد الأعضاء الذى يقرئون الموضوع فيما بعد أيضاً . وكلنا نريد أن تكون الموضوعات منظمه وتحوى شئ مفيد.

ولكن ما تحدثت عنه هو أنى أرى غلق وجعل المواضيع منقولة بكثره فى هذا المنتدى كما حدث معى عده مرات :blush: فإن إستمر هذا الحال فحذف الحساب مطلقاً أفضل حل :cool:

تم تعديل هذه المشاركة بواسطة ahmedsaoud31 في 23 فبراير 2012 في 12:05

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#16

اﻻمة الناجحة امة منظمة

لكل موضوع جديد مشكلة واحدة يتناولها اﻻعضاء بالمناقشة .

عذرا انا نسيت هذا ارجو من اﻻخوة التزام بذلك

فليتذكر الجميع كل اﻻعضاء المجتهدين متواجدين وسوف يساعدون كل زملائهم طارحى اﻻسئلة بكل حب وتعاون

تقبلو منى هذا والله ولى التوفيق

1

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#17
اقتباس
لم افهم الجملة التابعة لكلمة DO

عندو الوصول إلى الحلقة do while سيطلب البرنامج من المستخدم إدخال مسار الملف و يقوم بتخزينه في المصفوفة Title ثم يتحقق من هذا الشرط :

while(!(inp = fopen(Title, "r")))

و الشرط السابق مكافئ لــ :

while ((inp = fopen(Title, "r")) == NULL)

الدالة fopen مُختصرة من file open و لها وسيطين, الوسيط الأول خاص باسم الملف و الثاني يعني نمط التعامل مع الملف (قراءة, كتابة, إضافة في آخر الملف, قراءة و كتاية, ...).

هذا الأمر :

inp = fopen(Title, "r")

يعني إعطاء المؤشر inp عنوان الدالة fopen التي تعيد NULL في حالة تعذر وجود أو قراءة الملف.

إذا لم تعد الدالة fopen المؤشر NULL فهذا معناه أنه تمت قراءة الملف بنجاح و بالتالي الملف موجود.

هل اتضحت الفكرة ؟

إذا كانت هناك أية أسئلة فلا تتردد في طرحها أخي يوسف.

تم تعديل هذه المشاركة بواسطة khaled_prg في 23 فبراير 2012 في 13:19

1

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…