البرمجة

قراءة وحفظ ملفات النص في C++ باستخدام WinAPI

تحية طيبة وسلامٌ عليكم،

في محاولتك لقراءة ملفات النص من مجلد محدد وحفظ أسماء هذه الملفات في vector من السلاسل، تظهر بعض الأخطاء في الكود الخاص بك يجب عليك مراجعةها لتحقيق الوظيفة المطلوبة. سأقدم لك شرحًا تفصيليًا للمشكلات المحتملة وكيفية حلها.

أولًا، استخدم الدالة PathCombine لتكوين مسار الملف بدلاً من دمج السلاسل يدويًا. يمكن أن يساعد ذلك في تفادي أخطاء التنسيق.

cpp
#include #include #include #include using namespace std; struct Data { vector name; }; int main() { Data Dataset; WIN32_FIND_DATA FindFileData; HANDLE hFind; // Find the first file in the directory. hFind = FindFirstFile(L"C:\\Users\\bla\\Desktop\\c++\\data\\*", &FindFileData); if (hFind == INVALID_HANDLE_VALUE) { cout << "ERROR" << endl; } else { do { if (FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY) { // Construct the full path of the file TCHAR filePath[MAX_PATH]; PathCombine(filePath, L"C:\\Users\\bla\\Desktop\\c++\\data\\", FindFileData.cFileName); // Check if the file has a .txt extension if (_tcsstr(FindFileData.cFileName, L".txt")) { Dataset.name.push_back(FindFileData.cFileName); } wcout << FindFileData.cFileName << endl; } } while (FindNextFile(hFind, &FindFileData) != 0); FindClose(hFind); } for (int i = 0; i < Dataset.name.size(); i++) { cout << Dataset.name[i] << endl; } return 0; }

تأكد من أنك تقوم بفحص امتداد الملف بشكل صحيح باستخدام _tcsstr وأيضًا قم بالتحقق من أن الدليل الذي تحاول البحث فيه يحتوي على الملفات التي تبحث عنها.

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

المزيد من المعلومات

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

  1. استخدام do-while بدلاً من while:
    قمت بتغيير الحلقة while إلى حلقة do-while لضمان تنفيذ الكود داخل الحلقة على الأقل مرة واحدة. هذا يحل مشكلة إضافة ملفات إلى ال vector حتى في حالة وجود ملف واحد فقط.

    cpp
    do { // ... } while (FindNextFile(hFind, &FindFileData) != 0);
  2. استخدام _tcsstr بشكل صحيح:
    قمت بتحديد امتداد الملف باستخدام _tcsstr بشكل صحيح، مما يسمح للكود بالعمل بشكل صحيح مع تنسيقات الملفات المختلفة (مثل .txt).

    cpp
    if (_tcsstr(FindFileData.cFileName, L".txt")) { // ... }
  3. استخدام PathCombine لبناء مسار الملف:
    قمت بتحسين بناء مسار الملف باستخدام PathCombine، الذي يقوم بالتعامل مع تفاصيل تنسيق المسارات بشكل صحيح.

    cpp
    TCHAR filePath[MAX_PATH]; PathCombine(filePath, L"C:\\Users\\bla\\Desktop\\c++\\data\\", FindFileData.cFileName);
  4. التحقق من أن الملف ليس دليلاً:
    قمت بإضافة شرط للتحقق من أن العنصر الذي تم العثور عليه ليس دليلًا، للتأكد من أننا نقوم بجلب الملفات فقط.

    cpp
    if (FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY) { // ... }

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

زر الذهاب إلى الأعلى