PDA

View Full Version : چگونه خروجی یک برنامه را در برنامه ای دیگر استفاده کنیم ؟



djsohrab2007
جمعه 21 مرداد 1390, 00:29 صبح
سلام دوستان ،

واقعا انتخاب یک عنوان خوب که منظورم را کامل برسونه سخت بود، دیگه به بزرگی خودتون ببخشید.

منظور من این بود که :

فرض کنید من قبلا یک برنامه در سی پلاس پلاس نوشتم که چه می دونم مثلا یک عدد می خواند و 2 برابرش را چاپ می کند. ( اسم برنامه را بزاریم a ) حال در حال نوشتن یک برنامه دیگر هستم ( اسمش b ) .

در برنامه b می خواهم یک عدد از کاربر بگیرم و آن را به برنامه a بفرستم و خروجی برنامه a را

1 ) در خروجی b چاپ کنم.
2) داخل یک متغییر در برنامه b ذخیره کنم.

همانطور که می دانید ( فقط برای یاد آوری ) این کار را می خواهم با زبان C++ استاندارد انجام دهم( یعنی با کامپایلر Dev )

شرمنده وقت شما را گرفتم:خجالت:

quiet_programmer
جمعه 21 مرداد 1390, 12:51 عصر
با سلام.

برای این کار در برنامه a شما باید برای برنامتون آرگومان ورودی تعریف کنین و بهش بگین که خروجیش رو به جای نوشتن روی مانیتور به داخلی یه فایل بنویسه. بعد برنامه b فایل رو بازکنه و خروجی برنامه a رو که الان داخل فایل هست رو بخونه و بلا بیاره سرش. البته چون برنامه b داره برنامه a رو اجرا میکنه و برنامه b درحال اجراست شمانمیتونین مثل برنامه a براش آرگومان ورودی تعریف کنین. من یه مثال برات میزارم تا شاید بکارت بیاد.

برنامه a:

#include <iostream.h>
#include <fstream.h>

void main(int argc,char* argv[])
{
int Number;
if (argc==2)
Number=atoi(argv[1]);
else
cin>>Number;
ofstream Out("d:\\1.txt", ios::out);
Number*=Number;
Out<<Number;
Out.close();
}

این برنامه اگه بصورت a.exe Number (که Number یه عدده) اجرا بشه عدد رو به توان دو میروسنه و در فایل 1.txt مینویسه. و در صورتی که پارامتر ندی بهش از کاربر عدد رو دریافت میکنه و بعد از اینکه بلا سرش آورد تو فایل مینویسه.

برنامه b:
#include <iostream.h>
#include <string.h>
#include <fstream.h>
#include <conio.h>
void main()
{
int Number;
string Txt;
system("a.exe 30");
ifstream In;
do
In.open("d:\\1.txt", ios::in);
while (In==NULL);
In>>Txt;
Number=atoi(Txt.c_str());
In.close();
cout<<"B Program print result= "<<Number;

}

این برنامه با استفاده از دستور زیر فایل a.exe رو اجرا میکنه با پارامتر ارسالی عدد 30 (که همونطور که بدیهیه این عدد رو میتونین شما تغییر بدین). بعد منتظر میمونه تا برنامه a اجرا بشه و به اتمام برسه. بعد از اینکه برنامه a تموم شد فایل یک.txt رو تو درایو d ایجاد میکنه و بعد برنامه b این فایل رو باز میکنه و تو خروجی نشون میده.

دستور اجرای برنامه a توسط b:

system("a.exe 30");

موفق باشید.

djsohrab2007
شنبه 22 مرداد 1390, 03:01 صبح
سلام،

با تشکر از اینکه وقت گذاشتید و این برنامه را قدم به قدم توضیح دادید، واقعا ممنون.

اگر ناراحت نشید من سه تا سوال از این برنامه بپرسم :

1 ) دوست عزیز شما در برنامه b عددی که به برنامه a فرستادید برابر 30 بود ، حال اگر می خواستیم یک عدد مانند x ( در b ) را از ورودی بخوانیم و به جای 30 عدد x را به برنامه a می فرستادیم، باید چه تغییری انجام دهیم ؟

2) متغییر argc تعداد آرگومان های برنامه a را مشخص می کند، شما برای اینکه متوجه شوید کاربر ورودی نفرستاده چک کردید که آیا تعداد ورودی 2 تا است یا نه، چرا ؟ 1 ورودی که همان نام برنامه ( a.exe ) است ورودی دوم برای چیه ؟

3) برای باز کردن فایل در برنامه b ، آن را داخل یک حلقه گذاشتید ، چرا ؟ چرا همین طور معمولی آن را باز نکردید ؟ یعنی
In.open("d:\\1.txt", ios::in);

دوباره از شما می خواهم که مرا بابت اینکه مدام وقت شما را می گیرم ببخشید ، و مونونم از اینکه وقت گذاشتید.

pumper
شنبه 22 مرداد 1390, 06:15 صبح
1.
string c;
string cmd="a.exe ";
cin>>c;
cmd+=c;
system(cmd);

pumper
شنبه 22 مرداد 1390, 06:19 صبح
2.
آرگومان اول نام خود برنامه است و آرگومان دوم پارامتری که از ورودی خوانده می شود.
3.شاید می خواستند بعد از فراخوانی برنامه اول در برنامه دوم منتظر پایان اجرای برنامه اول و ایجاد فایل 1.txt توسط آن بماند

quiet_programmer
شنبه 22 مرداد 1390, 11:34 صبح
با سلام.

همه ی جوابهایی که جناب pumper (http://barnamenevis.org/member.php?40476-pumper) فرمودند صحیح بود. فقط برای شماره 3 فرمودند "شاید" که اصلاح میکنم "دقیقا".

موفق باشید.

djsohrab2007
شنبه 22 مرداد 1390, 15:27 عصر
ممنون از همگی کمک بسیاری به من کردید

quiet_programmer
یک شنبه 23 مرداد 1390, 11:33 صبح
با سلام.

نکته ای که الان به خاطرم رسید اینه که بهتره برنامه b وقتی فایل یک.txt رو از درایو d میخونه بلافاصله بعدش پاک کنه. چون اگه پاک نکنه برای اجرای بیشتر از یکبار برنامه b ممکنه مشکل پیش بیاد.

دستور پاک کردن فایل یک.txt از درایو d:

system("del d:\\1.txt");

این دستور رو بلافاصله بعد از اینکه فایل رو بستین اضافه کنین.

موفق باشید.

sh4mid
یک شنبه 23 مرداد 1390, 19:46 عصر
روش اصولیش Inter-process communication (http://en.wikipedia.org/wiki/Inter-process_communication) هست
Windows sample (http://msdn.microsoft.com/en-us/library/aa365574(v=vs.85).aspx)
Unix Sample (http://beej.us/guide/bgipc/)

djsohrab2007
شنبه 29 مرداد 1390, 21:52 عصر
با سلام.

نکته ای که الان به خاطرم رسید اینه که بهتره برنامه b وقتی فایل یک.txt رو از درایو d میخونه بلافاصله بعدش پاک کنه. چون اگه پاک نکنه برای اجرای بیشتر از یکبار برنامه b ممکنه مشکل پیش بیاد.

دستور پاک کردن فایل یک.txt از درایو d:

system("del d:\\1.txt");

این دستور رو بلافاصله بعد از اینکه فایل رو بستین اضافه کنین.

موفق باشید.

سلام، ممنون ولی مشکلی ایجاد نمی کنه ( در صورت پاک نکردن ) چرا که در برنامه a فایل را به صورت معمولی باز کردید یعنی اینکه وقتی فایل باز می شود دادها روی داده های قبلی نوشته خواهند شد اگر به صورت ios::app باز می کردید داده ها ادامه ی داده های قبلی نوشته می شدند
با تشکر از وقتی که گذاشتید.


روش اصولیش Inter-process communication (http://en.wikipedia.org/wiki/Inter-process_communication) هست
Windows sample (http://msdn.microsoft.com/en-us/library/aa365574%28v=vs.85%29.aspx)
Unix Sample (http://beej.us/guide/bgipc/)

سلام ، دوست عزیز می تونی این روش را به فارسی برای من توضیح دهی ( من انگلیسیم خیلی داغونه ) ؟ اگر یک مثال هم بزنی عالی میشه.

فقط لطف کن در ویندوز و با سی پلاس پلاس استاندارد ( کنسولی ) توضیح بده نه با سی پلاس پلاسی که ماکروسافت درست کرده ( منظورم همون گرافیکی هست )
با تشکر از وقتی که گذاشتید

djsohrab2007
شنبه 29 مرداد 1390, 22:10 عصر
من فکر کنم ( اگر اشتباه ترجمه نکرده باشم ) سوال من جزء مورد
Using COM for IPC

در انواع روش های IPC می باشد، می شود این را کامل تر توضیح دهید ؟

ممنون - ببخشید که وقت شما را می گیرما !

quiet_programmer
یک شنبه 30 مرداد 1390, 11:18 صبح
با سلام.


سلام، ممنون ولی مشکلی ایجاد نمی کنه ( در صورت پاک نکردن ) چرا که در برنامه a فایل را به صورت معمولی باز کردید یعنی اینکه وقتی فایل باز می شود دادها روی داده های قبلی نوشته خواهند شد اگر به صورت ios::app باز می کردید داده ها ادامه ی داده های قبلی نوشته می شدند
با تشکر از وقتی که گذاشتید.

ولی من به این دلیل نگفتم که مشکل پیش میاد. برنامه b برنامه a را اجرا میکنه و منتظر میمونه تا فایل تو درایو d ایجاد بشه. احتمال داره فایل a یکم دیر اجرا بشه و فایل رو دیرتر ایجاد کنه. در این صورت چون فایل یک.txt تو درایو d وجود داره (از اجرای قبلی مونده) اون فایل رو به اشتباه باز میکنه و مقدار قبلی رو میخونه.

موفق باشید

djsohrab2007
یک شنبه 30 مرداد 1390, 16:16 عصر
سلام
متوجه شدم، خیلی لطف کردی دوست عزیز، دستت طلا!

djsohrab2007
یک شنبه 30 مرداد 1390, 16:17 عصر
راستی کسی لطف میکنه این IPC را توضیح بده ؟

djsohrab2007
شنبه 05 شهریور 1390, 14:03 عصر
اینجا زده تعداد مشاهده 207 تا ، یعنی از این 207 نفر یک نفر بلد نبود ؟

mrsajjad
یک شنبه 06 شهریور 1390, 09:05 صبح
سلام دوست عزيز .
چرا اينطوري کار خودت را سخت مي کني . ++C محدود براي اين کارها وکي هم سخت مثل #C نيست به راحتي اين کارها را انجام بدي . فقط کافي برنامه a را در برنامه b بصورت تابع بنويسي . بعد يک متغير سراسري تعريف کني و جوابت را در آن متغير قرار دهي و در آخر در برنامه b ازش استفاده کني . به همين راحتي

;() void a
تعريف متغير سراسري
() void b
{
برنامه ات
}

() void a
{
برنامه
}

djsohrab2007
یک شنبه 06 شهریور 1390, 22:13 عصر
سلام دوست عزيز .
چرا اينطوري کار خودت را سخت مي کني . ++C محدود براي اين کارها وکي هم سخت مثل #C نيست به راحتي اين کارها را انجام بدي . فقط کافي برنامه a را در برنامه b بصورت تابع بنويسي . بعد يک متغير سراسري تعريف کني و جوابت را در آن متغير قرار دهي و در آخر در برنامه b ازش استفاده کني . به همين راحتي

;() void a
تعريف متغير سراسري
() void b
{
برنامه ات
}

() void a
{
برنامه
}


سلام، دستت طلا زدی کل صورت سوال را پاک کردی ها !!!!!!