سؤال

اسمحوا لي أن أبدأ بقول هذا يرتبط بمهمة الواجبات المنزلية. ومع ذلك، هذا جزء صغير للغاية وغير ضئيل نسبيا من المهمة.

يتلقى برنامج C الإدخال عبر وسيطات سطر الأوامر ولكنه يجب أن يكون في النموذج:

$ ./program < input

كيف، هل سأذهب في تلقي هذا الإدخال كسلسلة؟ في كل مرة أحاول طباعة الوسيطة الثالثة من argv أتلقى هذه الرسالة:

المدخلات: لا يوجد مثل هذا الملف أو الدليل.

هل كانت مفيدة؟

المحلول

<هو إعادة توجيه شل - يتم التعامل معها خارج البرنامج الخاص بك. ما تراه هو محتويات اسم الملف "الإدخال" يتم إرسالها إلى دفق الإدخال القياسي الخاص بك. هذه طريقة شائعة للبرامج التي تعمل، على الرغم من أنها عادة ما تتعامل أيضا في الحصول على اسم ملف على سبيل المثال sed.

إذا كان علي أن أعتقد أنني أعتقد:

input: No such file or directory.

يأتي من Shell، لأنه غير قادر على فتح الملف المحدد: "الإدخال".

من ناحية أخرى، إذا كنت تريد فعلا < input كحجج لبرنامجك، يمكنك الهروب منهم أو اقتباسهم حتى لا تفسرها القذيفة. (تهرب من اليسار كممارسة للقارئ :-)).

نصائح أخرى

ال ./program < input بناء الجملة هو بناء جملة شل خاص يقول "يعيد توجيه كل شيء في الملف المسمى input إلى الدخول القياسي للبرنامج ".

لقراءة المدخلات، يتعين على البرنامج فقط استخدام وظائف قراءة المدخلات القياسية، خط fgets أو scanf.

على أنظمة NIX، لن يكون عنصر ثالث argv. وبعد إذا قمت بتنفيذ هذا الأمر على أي شل تقريبا مثل Unix، فسيكون مشابها للقيام بذلك:

cat input | ./program

بحيث ./program لديه عنصر واحد فقط في argv, ، ولكنها stdin هو الملف input, ، لقراءة الملف الذي ستقرأ من stdin. وبعد لاحظ أن هذه طريقة صالحة تماما لتصميم البرنامج الخاص بك. قراءة العديد من برامج UNIX من المدخلات القياسية إذا لم يتم تقديم أي ملفات، بحيث يمكنك أن تؤدي إلى إدخال من البرامج الأخرى (أو في هذه الحالة، من الملفات).

ما يأتي بعد < ليست حجة سطر الأوامر. سيتم ربط محتويات الملف في برنامجك بواسطة Shell.

كل ما عليك فعله هو قراءة من Stdin وستحصل على محتويات الملف.

تحتاج إلى الهروب من "<"، وإلا فإن Shell سوف تحليلها، ولن يتلقى البرنامج في سطر الأوامر.

إذا كنت تستخدم باش، ثم:

./program '<' input

أو

./program \< input

قد تفعل قذائف أخرى بشكل مختلف (مثل Windows "الافتراضي، cmd.exe, ، الاستخدامات ^ كما شخصية الهروب، وليس \).

هذا هو شيء شل يونيكس. النموذج someprogram < somefile يروي بعض برامج التشغيل لتشغيل باستخدام شيء ما كإدخال لها. إذا كنت تريد أن تفعل شيئا مختلفا تنطوي < رمز، ستحتاج إلى اقتباسه.

ال < يعني أن البرنامج سيقرأ إنه مدخلات قياسية (Stdin) من الملف المسمى (الإدخال). لذلك فقط اقرأ من Stdin (باستخدام fgets, fread, ، إلخ).

أترك "<". تريد وسيطات سطر الأوامر تفعل هذا:

$ ./program -dflag seven = ixnay fromdinger

في طلبك، جرب هذا:

int main( int argc, char **argv )
{
   int i;
   for( i = 0 ; i < argc ; ++i )
      printf( "Arg %d = %s\n", i, argv[i] );
   return 0;
}

ستلاحظ أن الحجة الأولى هي اسم الملف القابل للتنفيذ (في الفهرس 0)، وستكون الوسيطة الثانية (في الفهرس 1) "-DFlag"

في الواقع، هذه تقنية شائعة جدا تستخدم في بطولات البرمجة. بيانات احتياجات البرنامج المخزنة في ملف، دعنا نقول Data.txt، ثم إعادة توجيهها إلى طلبك باستخدام "<" على Shell، مثل هذا: ./program <data.txt.

لذلك، في شفرة المصدر الخاصة بك، ما عليك القيام به هو شيء مثل هذا:

#include <iostream>
#include <string>

using namespace std;

int main(void)
{
    string tmp;
    string full_content;

    while (cin >> tmp)
        full_content += " "+tmp;

    cout << full_content << endl;
}

.. وستحصل على جميع البيانات من الملف على سلسلة (وفصلها عناق).

هذه طريقة واحدة للقيام بذلك، آمل أن يساعد ذلك. []'س

يمكنك الحصول عليها من خلال قراءة ستوتن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top