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

مشكلة مع برنامج ++c يتعامل مع ملف html و ملفات txt

بدأه hamany-pirlo في 18 أغسطس 2010 · 11 رد · 646 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

لقد قمت بكتابة برنامج يقوم بعمل نشرة لأحد المواقع ، و هذا البرنامج يقوم باخذ ملفات txt و أيضا ملفات html و من هذه الملفات يقوم بإنشاء النشرة البريدية ، و النشرة هي عبارة عن جدول مقسم إلى فئات و تحت كل فئة المنتجات الخاصة بتلك الفئة.

المشكلة الأولى : البرنامج يعمل بشكل صحيح و لكن فقط لخلية واحدة من الجدول (لمنتج واحد) ، و عندما يقوم البرنامج باستدعاء الدالة write_cell مرة أخرى يقوم البرنامج بتنفيذ بعض الأوامر و يتجاهل الأخرى.

المشكلة الثانية : البرنامج لا يظهر الكلمات العربية بشكل صحيح (مع العلم بأن كود الhtml كتب على الويندوز و كان يظهر بشكل صحيح في internet explorer) ، و لقد قرأت المشاركة السابقة بالنسبة إلى الكتابة باللغة العربية و لكن الحل كان يستخدم windows.h ، فما هي الطريقة للكتابة بشكل صحيح على لينكس "يوبنتو" ؟

#include <iostream>
#include <fstream>
using namespace std;

// a function to write the begining of the template to newsletter.htm
void write_begin (ifstream & begin, ofstream & newsletter)
{
	char ch;
	begin.get(ch);
	while (!begin.eof())
	{
		newsletter<<ch;
		begin.get(ch);
		}
	}

// a function to write the end of the template to newsletter.htm	
void write_end (ifstream & end, ofstream & newsletter)
{
	char ch;
	end.get(ch);
	while (!end.eof())
	{
		newsletter<<ch;
		end.get(ch);
		}
	}

// a function to write the category of the products to newsletter.htm
void write_title (ifstream & title, ofstream & newsletter)
{
	// getting the name of the category
	string category;
	cout<<"Enter the name of the category : \n";
	cin>>category;

	int count = 0;
	char ch;
	title.get(ch);

	// writing chars to newsletter.htm up until it reaches 
	// the place where to get the name of the category
	while (!title.eof())
	{
		if (count >= 2)
			break;

		if (ch == '>')
			count ++;

		newsletter<<ch;
		title.get(ch);
		}


	newsletter<<endl<<category;

	// resumming the writing process
	title.get(ch);
	while (!title.eof())
	{
		newsletter<<ch;
		title.get(ch);
		}
	}

// a function to write a cell (a product) to the table of products
void write_cell (ifstream & cell, ofstream & newsletter)
{
	// getting the product info.
	string product, source, link;
	cout<<"Enter the name of the product : \n";
	cin>>product;
	cout<<"Enter the image source : \n";
	cin>>source;
	cout<<"Enter the product link : \n";
	cin>>link;

	char qoute = 2;
	char ch;
	cell.get(ch);

	// writing chars to newsletter.htm up until it reaches 
	// the place to write the product link
	while (!cell.eof())
	{
		if (ch == 'f')
		{
			newsletter<<ch;
			break;
			}

		newsletter<<ch;
		cell.get(ch);
		}
	// writing the product link
	newsletter<<"="<<qoute<<link<<qoute;

	// writing chars to newsletter.htm up until it reaches 
	// the place to write the image source
	cell.get(ch);
	while (!cell.eof())
	{
		if (ch == 'c')
		{
			newsletter<<ch;
			break;
			}

		newsletter<<ch;
		cell.get(ch);
		}
	// writing the image source
	newsletter<<"="<<qoute<<source<<qoute;

	// writing chars to newsletter.htm up until it reaches 
	// the place to write the product name
	cell.get(ch);
	while (!cell.eof())
	{
		if (ch == 'c')
		{
			break;
			}

		newsletter<<ch;
		cell.get(ch);
		}
	// writing the product name
	newsletter<<endl<<product;

	// resumming the writing process
	cell.get(ch);
	while (!cell.eof())
	{
		newsletter<<ch;
		cell.get(ch);
		}
	}

//// a function to write the categories and the products to newsletter.htm
//void write (ifstream & cell, ifstream & title, ofstream & newsletter)
//{
	//char ch;
	//int n, count = 0;

	//cout<<"Enter the number of categories : \n";
	//cin>>n;

	//for (int i=0; i<n; i++)
	//{
		//write_title (title, newsletter);

		//cout<<"Enter (Y/N) if you would like to enter a product : \n";
		//cin>>ch;
		//while (ch == 'y' || ch == 'Y')
		//{
			//if (count == 0)
				//newsletter<<"<tr>";
			//if (count >= 3)
			//{
				//newsletter<<"</tr>";
				//count = 0;
				//}

			//write_cell (cell, newsletter);
			//count ++;

			//cout<<"Enter (Y/N) if you would like to enter a product : \n";
			//cin>>ch;
			//}
		//}
	//}

// a function to write the categories and the products to newsletter.htm
void write (ifstream & cell, ifstream & title, ofstream & newsletter)
{
	char ch = 'y', temp;
	int count = 0 ;

	cout<<"Enter (Y/N) for a category : \n";
	cin>>temp;

	// outer loop  for the categories 
	while (temp == 'y' || temp == 'Y')
	{
		write_title (title, newsletter);

		// inner loop for the products
		while (ch == 'y' || ch == 'Y')
		{
			if (count == 3)
			{
				newsletter<<"\n </tr> \n";
				count = 0;
				}
			cout<<"Enter (Y/N) if you would like to enter a product : \n";
			cin>>ch;
			if (ch == 'y' || ch == 'Y')
			{
				if (count == 0)
					newsletter<<"\n <tr> \n";
				write_cell (cell, newsletter);
				count ++ ;
				}
			else
				break;
			}
		cout<<"Enter (Y/N) for a category : \n";
		cin>>temp;
		ch = 'y';
		}
	}

int main()
{
	cout<<"Please create an html file named newsletter (newsletter.htm) in the same directory of this program\n\n";

	ifstream begin("begin.txt");
	ifstream end("end.txt");
	ifstream cell("cell.txt");
	ifstream title("title.txt");
	ofstream newsletter("newsletter.htm");

	// writting the begining
	write_begin (begin, newsletter);
	// creating the table of products
	write (cell, title, newsletter);
	// writing the end
	write_end (end, newsletter);


	return 0;
	}

newsletter program.zip

Program every day for 20 years and you will become a good programmer. Program every day for 10 years and study algorithms on the side and you will become a great programmer !

على الأقل هذا اللي سمعته ...

#2

:sad:

Program every day for 20 years and you will become a good programmer. Program every day for 10 years and study algorithms on the side and you will become a great programmer !

على الأقل هذا اللي سمعته ...

#3

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

المشكله لديك تكمن فى الـ encoding الخاص بصفحة الـ html التى تقوم بإنشائها حيث أنت لا تحدد طبيعة محتويات هذا الملف بمعنى الملف يحتوى على مجموعه من الحروف، هذه الحروف أنت لا تحدد أى صفحة محارف تتبع و لهذا فالوضع الإفتراضى يكون حسب اللغه الإفتراضيه المثبته على جهازك و إن قمت بتغيير الجهاز الذى يحتوى على الملف ستتغير معه النتائج التى ستظهر على المتصفح (و ليس محتويات الملف).

الحل لهذه المشكله هى أمر من إثنين، أولهم إما أن تقوم بضبط صفحة المحارف بالمتصفح لديك أثناء عرضه لملف الـ html خاصتك، أو أن تقوم بتحديد صفحة المحارف من داخل ملف الـ html بكتابة الكود التالى فى أعلى الملف (بعد تاج html بالطبع):

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

قم بتغيير utf-8 لرقم صفحة المحارف التى تريدها و تستطيع معرفتهم من خلال المتصفح لديك :

داخل firefox من قائمة view ثم character encoding و بداخلها العديد من صفحات المحارف لأكثر من لغه (يظهر اسمها و الكود الخاص بكل صفحه).

داخل IE من قائمة view ثم encoding و لكن يظهر إسم صفحة المحارف و ليس الكود الخاص بها

داخل Google Chrome من أيقونة Tools ثم Options ثم أختر Under the hood ثم أختر Change Font and Language Settings من الشاشة التى ستظهر لك قم بتغيير الـ Encoding من خلال Combo كتوب بجواره Default Encoding (يظهر إسم الصفحه و الكود الخاص بها).

أمر أخر هام جدا: جميع الملفات النصيه التى تقرأ منها لابد و أن تكون مكتوبه بـ Encoding واحد و هو نفسه ما تقوم بإستخدامه داخل ملف الـ html و ذلك حتى تظهر النصوص بشكل صحيح.

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 20 أغسطس 2010 في 01:48

1

مدونتي: C++ Tips and Tricks

#4

كما قال الأخ محمد ،

أيضاً ( كما أتوقع ) من الأفضل أن تستخدم الفئات الخاصة بالنوع stringw ( أي unicode ) ، فمثلاً لا تستخدم std:string ، ولكن استخدم std:wstring .. ومثل ذلك wofstream بدلاً من ofstream وهكذا ، لو كان هناك عمليات تجريها على النصوص unicode داخل برنامجك .

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

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#5

@محمد علاء:

و لم لا يتسخدم UTF-8؟ فإن إستخدم مثلا Windows-1256 فإنه عند عرض الصفحه في جهاز/متصفح لا يدعم هذا الترميز فلن تظهر الأحرف بالطريقه الصحيحه.. أما عند إستخدام UTF-8 فإنها تدعم كل (معظم) الرموز الموجوده....

بالمناسبه, أعجبتني كلمة "صفحة المحارف" :D

تم تعديل هذه المشاركة بواسطة هويدي في 20 أغسطس 2010 في 07:49

#6
محمد علاء الدين كتب:

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

المشكله لديك تكمن فى الـ encoding الخاص بصفحة الـ html التى تقوم بإنشائها حيث أنت لا تحدد طبيعة محتويات هذا الملف بمعنى الملف يحتوى على مجموعه من الحروف، هذه الحروف أنت لا تحدد أى صفحة محارف تتبع و لهذا فالوضع الإفتراضى يكون حسب اللغه الإفتراضيه المثبته على جهازك و إن قمت بتغيير الجهاز الذى يحتوى على الملف ستتغير معه النتائج التى ستظهر على المتصفح (و ليس محتويات الملف).

الحل لهذه المشكله هى أمر من إثنين، أولهم إما أن تقوم بضبط صفحة المحارف بالمتصفح لديك أثناء عرضه لملف الـ html خاصتك، أو أن تقوم بتحديد صفحة المحارف من داخل ملف الـ html بكتابة الكود التالى فى أعلى الملف (بعد تاج html بالطبع):

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

قم بتغيير utf-8 لرقم صفحة المحارف التى تريدها و تستطيع معرفتهم من خلال المتصفح لديك :

داخل firefox من قائمة view ثم character encoding و بداخلها العديد من صفحات المحارف لأكثر من لغه (يظهر اسمها و الكود الخاص بكل صفحه).

داخل IE من قائمة view ثم encoding و لكن يظهر إسم صفحة المحارف و ليس الكود الخاص بها

داخل Google Chrome من أيقونة Tools ثم Options ثم أختر Under the hood ثم أختر Change Font and Language Settings من الشاشة التى ستظهر لك قم بتغيير الـ Encoding من خلال Combo كتوب بجواره Default Encoding (يظهر إسم الصفحه و الكود الخاص بها).

أمر أخر هام جدا: جميع الملفات النصيه التى تقرأ منها لابد و أن تكون مكتوبه بـ Encoding واحد و هو نفسه ما تقوم بإستخدامه داخل ملف الـ html و ذلك حتى تظهر النصوص بشكل صحيح.

و الله ولي التوفيق

شكراُ جزيلأ لك أخ محمد علاء ، الآن أصبح البرنامج يدعم اللغة العربية :) ، و النص يظهر بشكل صحيح على firefox, IE, opera .

الآن بالنسبة إلى المشكلة الأولى ، أعلم بأن الكود طويل نسبياُ ، و لكي أضيق عليكم مجال البحث عن الخطأ ، فإني أتوقع بأن لدي مشكلة في التعامل مع الملفات (و ليس من حيث منطق الكود بما أنه عند إستدعائي للدالة write_cell للمرة الأولى فإنها تعمل بشكل صحيح).

فسؤالي هو كالتالي : هل من المفترض أني عندما أقوم بإستدعاء دالة تتعامل مع الملفات فإنه يجب علي أن أقوم بفتح الملف المراد إستخدامه ثم إغلاقه في كل مرة أستدعي فيها هذه الدالة ؟

ملاحظة : لقد نسيت أن أغلق الملفات في الدالة main في نهاية الدالة :blush: ، و لكن المشكلة لازالت قائمة.

تم تعديل هذه المشاركة بواسطة hamany-pirlo في 20 أغسطس 2010 في 09:36

Program every day for 20 years and you will become a good programmer. Program every day for 10 years and study algorithms on the side and you will become a great programmer !

على الأقل هذا اللي سمعته ...

#7
اقتباس

و لم لا يتسخدم UTF-8؟ فإن إستخدم مثلا Windows-1256 فإنه عند عرض الصفحه في جهاز/متصفح لا يدعم هذا الترميز فلن تظهر الأحرف بالطريقه الصحيحه.. أما عند إستخدام UTF-8 فإنها تدعم كل (معظم) الرموز الموجوده....

الإجابه

اقتباس

أمر أخر هام جدا: جميع الملفات النصيه التى تقرأ منها لابد و أن تكون مكتوبه بـ Encoding واحد و هو نفسه ما تقوم بإستخدامه داخل ملف الـ html و ذلك حتى تظهر النصوص بشكل صحيح.

اقتباس
بالمناسبه, أعجبتني كلمة "صفحة المحارف" :D

انا كسول و لا احب أن اغير لغة الكيبورد كثيرا عندما اكتب، فبدل ما افضل اكتب code page نمشيها صفحة محارف و برضه الناس هتفهم.

على فكره الكلمه دى مش انا قايلها و معرفش حتى عرفتها ازاى :wacko: بس هي جت كده.

اقتباس
شكراُ جزيلأ لك أخ محمد علاء ، الآن أصبح البرنامج يدعم اللغة العربية :) ، و النص يظهر بشكل صحيح على firefox, IE, opera .

الحمد لله

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

#8

لم أفهم قصدك أخ محمد...

طالما أنه يريد العمل على ويندوز و لينوكس,,, فإستخدام UTF-8 هو الأنسب.... هل فاتني شئ :S

#9
اقتباس
طالما أنه يريد العمل على ويندوز و لينوكس,,, فإستخدام UTF-8 هو الأنسب.... هل فاتني شئ :S

ما فاتك انه لا يكتب بنفسه داخل ملف الـ html و لكنه ينسخ من ملفات نصيه لا احد يعلم ما هو الـ encoding ألخاص بها و بالتالى المشكله لن تكون فى ماهية الـ encoding الخاص بملف الـ html و لكن بماهية الـ encoding الخاص بالمفات النصيه التى يتم النسخ منها، حيث إذا كانت المفات النصيه بترميز windows-1256 و تم جعل ملف الـ html بترميز UTF-8 فلن تظهر النصوص على المتصفح بشكل سليم.

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

#10
hamany-pirlo كتب:

فسؤالي هو كالتالي : هل من المفترض أني عندما أقوم بإستدعاء دالة تتعامل مع الملفات فإنه يجب علي أن أقوم بفتح الملف المراد إستخدامه ثم إغلاقه في كل مرة أستدعي فيها هذه الدالة ؟

هل من مجيب على هذا السؤال ؟

و من جهة أخرى ، كيف حال google summer of code أخ محمد علاء ؟ هل إنتهيتم منه ؟

Program every day for 20 years and you will become a good programmer. Program every day for 10 years and study algorithms on the side and you will become a great programmer !

على الأقل هذا اللي سمعته ...

#11
اقتباس

فسؤالي هو كالتالي : هل من المفترض أني عندما أقوم بإستدعاء دالة تتعامل مع الملفات فإنه يجب علي أن أقوم بفتح الملف المراد إستخدامه ثم إغلاقه في كل مرة أستدعي فيها هذه الدالة ؟

لا، طالما انك تستخدم الكائن الذى فتح الملف و ليس أخر :blush: .

اقتباس
و من جهة أخرى ، كيف حال google summer of code أخ محمد علاء ؟ هل إنتهيتم منه ؟

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

مدونتي: C++ Tips and Tricks

#12

@ محمد علاء الدين

شكراُ لك لإجابتك على أسئلتي ، سأحاول اليوم أن أجد ما هي المشكلة في الكود ، فإن لم أجدها فسأحاول أن أقوم بكتابة الكود بطريقة أخرى من جديد.

سبب سؤالي عن المسابقة هو أني لطالما أقرأ عنها من وقت لآخر ، و كنت أتمنى لكم التوفيق أنت و خالد الشايع من كل قلبي ، و من يعلم لربما أحظى بشرف الإشتراك معك فيها مستقبلاُ :happy: .

تم تعديل هذه المشاركة بواسطة hamany-pirlo في 21 أغسطس 2010 في 03:58

Program every day for 20 years and you will become a good programmer. Program every day for 10 years and study algorithms on the side and you will become a great programmer !

على الأقل هذا اللي سمعته ...

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

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

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

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

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