السلام عليكم أخوتي في الله..
واجهتني عدة مشاكل في كتابة أحد البرامج, بحثت هنا وهناك..ووجدت حلاً لبعضها والبعض الأخر مازلت أقف حائراً أمامه..
وها أنا ألجا إليكم, لعلي أجد إجابات شافية استفيد ويستفيد غيري منها..وتكتب لك في موازين حسناتكم أن شاء الله..
# الاستفسار الأول:
لنفرض أني كتبت مثل هذا البرنامج الصغير:
void main()
{
char s[100];
cin>> s;
cout<< s;
}عندما أدخل كلمة في المتغير s , ولتكن مثلاً " hi world's "..
يُخزن في المتغير كلمة " hi " فقط , وهكذا مع إي جملة لا تُخزن إي جملة بعد المسافة !
ونفس المشكلة تحصل مع المتغير string..
ماهو التفسير لهذه المشكلة ؟ وكيف أستطيع التعامل معها ؟!
# الاستفسار الثاني ( عن الـfiles ):
قمت باستدعاء ملف بهذا الشكل:
fstream OpenFile("c:\\file.txt",ios::in);وأريد تخزين السطر كاملاً إذا كان أقل من 80 حرفاً وإذا كان أكبر من 80 حرفاً, أُخزن الـ80 حرفاً في المتغير والحروف الباقية في متغير أخر..
وقمت بعمل هذه الطريقة:
int main()
{
char s[1000];
fstream OpenFile("c:\\file.txt",ios::in);
while(!OpenFile.eof())
{
OpenFile.getline(s,80);
cout<< s << endl;
}
return 0;
}ولكن لا يحدث شيئاً ؟ يستمر في التكرار بلا توقف..!
ولو قمت بوضع بدل الـ 80 , ألف..
OpenFile.getline(s,1000);
يأتي بالملف بشكل جيد " مع العلم أنه لا يوجد في الملف سطر أكثر من 100 حرف "
ولقد قمت بتجربة بهذا الشكل:
int main()
{
char s[1000];
fstream OpenFile("c:\\hi.txt",ios::in);
int i = 0;
while(i != 1)
{
OpenFile.getline(s,80);
cout<< s << endl;
i++;
}
return 0;
}ويقوم بتخزين 80 حرفاً بشكل جيد !
وقمت بتجربة أخرى بجعل التكرار يعمل مرتين..
int main()
{
char s[1000];
fstream OpenFile("c:\\hi.txt",ios::in);
int i = 0;
while(i != 2)
{
OpenFile.getline(s,80);
cout<< s << endl;
i++;
}
return 0;
}ولكن يقوم بنسخ الـ 80 سطراً الأولى فقط !
فـ يطبع فقط 80 حرفا..والسطر الأخر فراغ !؟
أين الخلل هنا ؟
# الاستفسار الثالث:
عندما قمت بجلب ملف من الـfiles, وأردت تخزينه في لينكد ليست..
ولنفرض أن الفايل يحتوي على الثلاثة السطور التالية:
looooooooooool
wooooooooooow
boooooooooooom
قمت بكتابة الكود هكذا:
int main()
{
list e;
char s[1000];
fstream OpenFile("c:\\testfile.txt",ios::in);
int i = 0;
while(!OpenFile.eof())
{
OpenFile.getline(s,1000);
e.insert(s);
}
e.print();
return 0;
}يقوم بإنشاء ثلاث " نودات ", والتخزين فيهم أخر سطر " boooooooom " !!
مع العلم أني جربت طباعة الـ s قبل عمل له insert في النود..فـ فيطبع الثلاث سطور بشكل سليم..
OpenFile.getline(s,1000); cout<< s << endl; e.insert(s);
وهذه هي دالة الـ insert التي كتبتها:
void Editor::insert(char *s)
{
node *p = new node(s);
if(head == 0 )
{
head = tail = p;
size++;
}
else
{
tail->next = p;
p->pre = tail;
tail = p;
size++;
}
}وأين الخلل أيضاً ؟!..
أعتذر على الإطالة..وكثرة الأسئلة..
وأتمنى أن أجد إجابة على ما أحترت فيه..
جعلها الله في موازين حسناتكم..وجزاكم الله خيراً..
أخوكم..
