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

[ تمت الإجابة ]كتابة نتيجة برنامج في ملف خارجي !

بدأه ريان1407 في 23 أكتوبر 2012 · 8 رد · 1,109 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

قمت بكتابة برنامج باستخدام لغة C لعمل عمليات حسابية وحساب المدة المستغرقة

وارغب بكتابة نتيجة هذا الكود في ملف خارجي

(أي ان القراءة من الملف الحالي الى ملف خارجي اسمه RESULT.OUT

الكود لا يوجد فيه اي خطا ولكن لا اجد شي مكتوب في الملف الخارجي !!

قمت باستخدام التالي ( نسخت لكم كود القراءة والكتابة من برنامجي ) للبحث عن الخطأ !

عرفت بارامترين للملف المصدر والملف الخارجي

 FILE* fp1 ;
    FILE* fp2 ;
    fp1=fopen("HOME/CALCULATION.cpp","w");
    fp2=fopen("HOME/RESULT.out","r");
    char buffer[BUFFER_LENGTH];

في اخر البرنامج استدعيت الدالتين fputs & fgets

while((fgets(buffer,BUFFER_LENGTH,fp1))!=0)
	{
	fputs(buffer,fp2);
	fprintf(fp2,buffer);
	}

مالخطأ في ذلك ؟؟

وشكرا لكم مقدماً :happy:

تم تعديل هذه المشاركة بواسطة ريان1407 في 23 أكتوبر 2012 في 19:42

#2

وعليكم السلام أخي ريان

الخطأ موجود هنا في هذين السطرين

	fp1=fopen("HOME/CALCULATION.cpp","w");
	fp2=fopen("HOME/RESULT.out","r");

لقد عكست وضعية ال modeOuverture ؟

كان عليك أن تكتب هكذا

	fp1=fopen("HOME/CALCULATION.cpp","r");
	fp2=fopen("HOME/RESULT.out","w");

لا ينصح باستعمال هذه الدوال (fgets ,fprintf ..) في قراءة أو الكتابة على ملف مكتوب في الوضع الثنائي mode binaire

ولا يقرأ أو يفتح بمحرر نص كلاسيكي (Bloc-notes مثلا) .

هناك دوال أخرى تقوم بهذا الغرض

fwrite()
fread()

الكود النهائي في ويندوز

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

int main(void)
{
	char buffer[20]="";
	FILE* fp1=NULL ;
	FILE* fp2=NULL ;
	fp1=fopen("C:\\Documents and Settings\\MOMO\\My Documents\\karim\\fo.txt","r");
	fp2=fopen("C:\\Documents and Settings\\MOMO\\My Documents\\karim\\mo.txt","a");
	if(!fp1||!fp2)
	{
    	perror("");
    	printf("%d",errno);
    	exit(EXIT_FAILURE);
	}
	while((fgets(buffer,20,fp1))!=0)
    	{
    	fputs(buffer,fp2);
    	}
   fclose(fp1);
   fclose(fp2);
   return EXIT_SUCCESS;
}

وفقك الله

2

i love you mama

#3

الف شكر لك على التوضيح أنا فهمت خطائي :)

ممكن توضح لي معنى perror("");

اول مره تمر علي !

هنا printf("%d",errno); اعطاني عليها رسالة خطأ !

لان errno غير معرف ! ماذا تقصد به بالتحديد ؟

تم تعديل هذه المشاركة بواسطة ريان1407 في 24 أكتوبر 2012 في 00:38

#4

لسه مايكتب !

كذا كودي صار ( عالوندوز )

الثوابت

#define BUFFER_LENGTH 1000

تعريف المتغيرات

FILE* fp1 ;
    FILE* fp2 ;
    fp1=fopen("C:\TC\BIN\calculation.cpp","r");
    fp2=fopen("C:\TC\BIN\result.out","w");
    char buffer[BUFFER_LENGTH];

في ذيل البرنامج

    while((fgets(buffer,BUFFER_LENGTH,fp1))!=0)
	{
	fputs(buffer,fp2);
	}
    fclose(fp2);
    fclose(fp1);

تم تعديل هذه المشاركة بواسطة ريان1407 في 24 أكتوبر 2012 في 01:03

#5
اقتباس
الكود لا يوجد فيه اي خطا ولكن لا اجد شي مكتوب في الملف الخارجي !!

كيف تأكدت أنه لايوجد خطأ؟ لا أرى أنك تاكدت من القيمة التي تعيدها fopen. لما تفشل fopen بفتح الملف, وأغلب دوال سي, لن تظهر لك أي رسالة خطأ. تأكد دوماً أن الدالة لم تفشل, في حالة fopen فستعيد NULL.

FILE *fh = NULL;

fh = fopen("file.txt", "r");
if( fh == NULL ) {
    perror("Error");
    return -1;
}

ستطبع لك perror سبب الخطأ (تعطي إطبع الخطأ print error).

إذا كنت تستخدم لينكس أو ماك فهذا المسار لايبدو صحيح:

HOME/CALCULATION.cpp

كلا النظامين حساسان لحالة الأحرف يعاملان home و Home و HOME على أنها أسماء مختلفة. ولايُمكنك أيضاً الكتابة في المسار home/ مباشرة, المفترض غالباً:

/home/إسم المستخدم/file.txt

من الأفضل أن لاتكتب المسار الكامل, فقط ضع الملف في نفس المسار البرنامج. إنظر لبرنامج يقرأ ملف إسمه file.in ويستمر في الكتابة حرف بحرف في file.out :

#include <stdio.h>

#define SRCFILE "file.in"
#define DESFILE "file.out"

int main(int argc, char **argv)
{
    FILE *src = NULL;
    FILE *des = NULL;
    char buff;

    if( (src = fopen(SRC_FILE, "r")) == NULL ) {
        perror("Error");
        return -1;
    }

    if( (des = fopen(DES_FILE, "w")) == NULL ) {
        perror("Error");
        fclose(src);
        return -1;
    }


    while( fread(&buff, sizeof(char), 1, src) != 0 ) {
        fwrite(&buff, sizeof(char), 1, des);
    }

    fclose(src);
    fclose(des);

    return 0;
}
1
#6

أهلا مرة أخرى أخي ريان

اقتباس
هنا printf("%d",errno); اعطاني عليها رسالة خطأ !

لان errno غير معرف ! ماذا تقصد به بالتحديد ؟

أنت تريد فتح ملف ولكن لأسباب مجهولة لم يفتح هذا الأخير . كيف يمكنك أن تعرف نوع المشكل الذي صادفك أثناء عملية الفتح؟؟

هل لأن الملف ببساطة غير موجود؟ أو محمي ؟

من هنا جاءت errno لتبين السبب الرئيسي لذلك !

هذا المتغير العام من نوع int قد يأخذ عدة قيم معرفة مسبقا . شاهد هذا ال رابط , سترى مجموعة من ال defines لكل واحد قيمة خاصة به (قيم لا تعرفها ونحن لن نهتم لذلكhappy.gif)

عندما يحدث خطأ ,errno تأخذ قيمة أحد هذه defines المعرفة سابقا وهكذا بمعرفة قيمة errno فالمبرمح يعرف طبيعة الخطأ.

كيف أستعمل errno ؟

إنها فقط متغير كباقي المتغيرات يلزمك فقط القيام بعملية المقارنة

مثلا

if (errno == ENOENT) /* الملف غير موجود */
	puts("Fichier ou repertoire inexistant. ");

اقتباس
هنا printf("%d",errno); اعطاني عليها رسالة خطأ !

لا تنسى تضمين errno.h في الكود لتتفادى أخطاء الترجمة ؟؟

استعمال آخر ل errno :

استعمال errno بالطريقة السابقة جيد ولكن يلزمك القيام بمقارنة هذا الأخير مع كل defines

المعرفة سابقا حتى تتمكن من معرفة طبيعة الخطأ مع العلم أن هناك حوالي 40 قيمة لتقارنها مع errno ! dry.gif

من هنا جاءت فكرة الدالة perror

void perror(const char* str) ;

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

perror("Erreur : ");

Erreur : : No such file or directory

إذا ظهر لك هذا الخطأ مثلا على الشاشة فهذا يعني أن ال file أو ال repertoire غير موجود

وعليك أ تميز بين حالتين:

-عندما تمرر نصا للدالة ستظهر ':' مرتين في الشاشة.

-عندما لا تمرر نصا فلن تظهر ':' أي مرة في الشاشة وسيطبع الخطأ وفقط.

الكود النهائي

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#define BUFFER_LENGTH 100

void f_error(void);

int main(void)
{

	char buffer[BUFFER_LENGTH]="";
	FILE *fp1=NULL ,*fp2=NULL;
	fp1=fopen("HOME/RAYAN/file1.txt","r");
	fp2=fopen("HOME/RAYAN/file2.txt","w");
	if(!fp1)
  	f_error();
	if(!fp2)
  	f_error();
	while((fgets(buffer,BUFFER_LENGTH,fp1)))
  	{
    	printf("%s",buffer);
    	fputs(buffer,fp2);
  	}
   fclose(fp1);
   fclose(fp2);
   return EXIT_SUCCESS;
}

void f_error(void)
{
   perror("");
   printf("%d",errno);
   exit(EXIT_FAILURE);
   return;
}

لقد جاء في الكود الثاني الذي كتبته :

	fp1=fopen("C:\TC\BIN\calculation.cpp","r");
	fp2=fopen("C:\TC\BIN\result.out","w");

هذه الكتابة للمسار خاطئة؟

عليك أن تكتب

	fp1=fopen("C:\\TC\\BIN\\calculation.cpp","r");
	fp2=fopen("C:\\TC\\BIN\\result.out","w");

إذا لا حظت جيدا فقد وضعت في كل مرة خطين مائلين '\\' . عندما نضع خطا مائلا واحدا '\' سيعتقد الجهاز أننا بصدد إدراج رمز خاص مثل 'n\' أو 't\' .

إذا أردت أن تكتب خطا مائلا في نصك عليك أن تكتب '\' مرتين حتى يفهم الجهاز أن الرمز الذي نريد استعماله هو '\'.

بالتوفيق

تم تعديل هذه المشاركة بواسطة مومو (momo) في 24 أكتوبر 2012 في 19:28

1

i love you mama

#7

الله يجزااكم الف خير ضبط معاي الحمدلله :)

الامتداد بس شلته ومشى الحال وجربت دبل سلاش وضبط ايضا :)

بس فضلت يكون بدون امتداد حتى يشتغل على الوندوز واللينكس بنفس الوقت بدون تعديل.

انا كنت اقول مافي خطا اقصد الكمبايلر مايظهر لي اخطاء :blush:

:happy: شكرا مره ثانيه الله يوفقك يارب ومن ساعدني معاك.

طيب على افتراض عندي الكود التالي

#include<stdio.h>

int main() {
  int num;
  int factorial;

  printf("Enter a number: ");
  scanf("%d",&num);

  for (factorial = num; num > 1; --num) {
    factorial = factorial *(num - 1 );
  }

  printf("The factorial is: %d\n", factorial);
  return 0;
}

وابغى نتيجة المضروب تظهر بالملف الخارجي. وين يفترض احط gets&puts داخل for ? جربتها داخلها مااشتغلت !

حطيت gets داخل for وانشأت for جديدة للputs بس مااشتغلت بعد ..

ممكن نصيحتكم !

تم تعديل هذه المشاركة بواسطة ريان1407 في 24 أكتوبر 2012 في 23:20

#8
اقتباس
ابغى نتيجة المضروب تظهر بالملف الخارجي

استخدم fprintf بدلاً من printf, هكذا :

#include<stdio.h>

int main() {
    int num, factorial;
    FILE* File = fopen("fichier.txt", "w");

    printf("Enter a number: ");
    scanf("%d", &num);

    for (factorial = num; num > 1; --num) {
        factorial = factorial * (num - 1);
    }

    fprintf(File, "The factorial is: %d\n", factorial);
    fclose(File);
    return 0;
}

تم تعديل هذه المشاركة بواسطة khaled_prg في 25 أكتوبر 2012 في 00:24

2
#9

بالضبط :)

صح ..

الله يوفقك خالد :happy:

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

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

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

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

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