سؤال

كان مجرد سؤال عام حول كيفية التعامل مع مشكلة معينة أواجهها. أنا جديد إلى حد ما على C لذا تحمل معي هنا. لنفترض أن لدي مجلد يحتوي على 1000+ ملف نص ، لا يتم تسمية الملفات بأي نوع من الترتيب المرقم ، لكنها أبجدية. بالنسبة لمشكلتي ، لديّ ملفات من بيانات الأسهم ، يتم تسمية كل ملف باسم الشركة المعنية. أرغب في كتابة برنامج سيفتح كل ملف ، وقراءة البيانات ، ابحث عن المنخفض التاريخي ومقارنته بالسعر الحالي وحساب تغيير النسبة المئوية ، ثم طباعته. البحث والحساب ليس مشكلة ، المشكلة هي الحصول على البرنامج للمرور وفتح كل ملف. الطريقة الوحيدة التي يمكنني رؤيتها لمهاجمة هذا هي إنشاء ملف نصي يحتوي على جميع رموز اللمعان ، وجعل البرنامج يقرأ ذلك في صفيف ثم قم بتشغيل حلقة تفتح أولاً اسم الملف الأول في الصفيف ، وأداء الحسابات ، وطباعة الإخراج ، وأغلق الملف ، ثم حلقة العودة حول الانتقال إلى العنصر الثاني (رمز مؤشر التالي) في الصفيف. سيكون هذا بسيطًا إلى حد ما (على ما أظن) ، لكنني أود حقًا تجنب الكتابة على أكثر من ألف اسم ملفات في ملف نصي. هل هناك طريقة أفضل للتعامل مع هذا؟ لا تطلب حقًا رمزًا (ما لم تكن هناك بعض الوظائف المذهلة في C التي ستقوم بذلك من أجلي ؛)) ، فقط بعض النصائح من مبرمجي C الأكثر خبرة.

شكرًا :)

تحرير: هذا على Linux ، آسف لقد نسيت أن أقود ذلك!

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

المحلول

تحت Linux/Unix (BSD ، OS X ، Posix ، إلخ) يمكنك استخدامه Opendir / Readdir للذهاب من خلال هيكل الدليل. لا حاجة لإنشاء ملفات ثابتة تحتاج إلى تحديث ، عندما يكون لنظام الملفات المعلومات التي تريدها. إذا كنت تريد فقط مجموعة فرعية من الأسهم في وقت معين ، فاستخدام العالم سيكون أسرع ، هناك أيضا الفراغ.

لا أعرف ما تسمى وظائف Win32 (Windows / Platform SDK) ، إذا كنت تتطور باستخدام Visual C ++ كمترجم C. يبحث مكتبة MSDN يجب أن تساعدك.

نصائح أخرى

على افتراض أنك تعمل على Linux ...

ls /path/to/text/files > names.txt

هو بالضبط ما تريد.

لا توجد وظائف في القياسيات C التي لها أي فكرة عن "دليل". ستحتاج إلى استخدام نوع من الوظائف الخاصة بالمنصة للقيام بذلك. لبعض الأمثلة ، ألق نظرة على هذا المنشور من cprogrammnig.com.

شخصيا ، أنا أفضل استخدام opendir()/readdir() النهج كما هو موضح في المثال الثاني. إنه يعمل أصلاً تحت Linux وأيضًا على Windows إذا كنت تستخدم Cygwin.

النهج 1) سيكون لدي فقط دليل محدد لدي فقط هذه الملفات التي تحتوي على بيانات مؤشر ولا شيء آخر. ثم سأستخدم C readdir API لسرد جميع الملفات في الدليل وتكرارها على كل واحد يقوم بإجراء معالجة البيانات التي تحتاجها. الذي يتم تحديد المعلومات التي ينطبق عليها الملف فقط بواسطة اسم الملف.

الايجابيات: من السهل رمز

السلبيات: يعتمد الأمر حقًا على مكان تخزين الملفات ومن أين تأتي.

النهج 2) قم بتغيير تنسيق الملف بحيث تبدأ ملفات Ticker برمز سحري يحدد أن هذا ملف مؤشر ، وسلسلة تحتوي على الاسم. كما كان من قبل استخدام ReadDir للتكرار من خلال جميع الملفات في المجلد وافتح كل ملف ، تأكد

الايجابيات: أكثر مرونة من ذي قبل. لا يلزم أن يعكس اسم الملف اسم سلبيات Ticker: من الصعب على رمز ، قد يتم إصلاح تنسيق الملف.

لكني أود حقًا تجنب الكتابة أكثر من ألف اسم ملفات في ملف نصي. هل هناك طريقة أفضل للتعامل مع هذا؟

لقد قمت بحل نفس المشكلة بالضبط لفترة من الوقت ، وإن كان للاستخدامات الشخصية :)

ما فعلته هو استخدام أوامر OS Shell لإنشاء قائمة من هذه الملفات وإعادة توجيه الإخراج إلى ملف نصي وتم تشغيل البرنامج الخاص بي من خلالها.

في رمز الزائفة ، سيبدو هكذا ، لا يمكنني تحديد الرمز لأنني لست متأكدًا بنسبة 100 ٪ إذا كان هذا هو النهج الصحيح ...

for each directory entry
    scan the filename
         extract the ticker name from the filename
         open the file
              read the data
              create a record consisting of the filename, data.....
         close the file
         add the record to a list/array...
> sort the list/array into alphabetical order based on 
  the ticker name in the filename...

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

أتمنى أن يساعد هذا ، مع أطيب التحيات ، توم.

على يونيكس ، هناك مفيد العالم وظيفة:

glob_t results;
memset(&results, 0, sizeof(results));
glob("*.txt", 0, NULL, &results);
for (i = 0; i < results.gl_pathc; i++)
    printf("%s\n", results.gl_pathv[i]);
globfree(&results);

على Linux أو نظام ذي صلة ، يمكنك استخدام مكتبة FTS. إنه مصمم لاجتياز التسلسلات الهرمية للملفات: رجل fts,

أو حتى شيء بسيط مثل Readdir

إذا كان على Windows ، يمكنك استخدامهم إدارة الدليل API. بشكل أكثر تحديدا ، FindFirstfile وظيفة ، تستخدم مع البطاقات البرية ، بالتزامن مع FindNextFile

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