البرمجة

قراءة وتخزين ملف النص في مصفوفة ثنائية الأبعاد باستخدام C++

في البداية، يظهر أن لديك تحدي في قراءة ملف النص وتخزينه في مصفوفة ثنائية الأبعاد في لغة البرمجة C99 باستخدام مكتبة vector. دعني أشرح لك الكود وأقدم بعض النصائح لتحسينه.

قبل البدء في الشرح، يجدر بنا أولاً أن نلفت انتباهك إلى أن الكود الحالي يعاني من بعض المشاكل، منها:

  1. لا تحتاج إلى فتح الملف باستخدام fstream وإغلاقه باستخدام file.close()، حيث أنك قد فتحت الملف بالفعل باستخدام ifstream.
  2. الاستخدام الخاطئ لشرط الخروج من حلقة for، حيث أن maze[i][j] لا يمكن أن يكون مساويًا للنهاية \0، ولكن يمكن أن يكون مساويًا للفراغ أو أي قيمة أخرى.

الآن دعني أقدم لك كودًا مع شرح مفصل:

c
#include #include #include using namespace std; int main() { // Open the file ifstream myReadFile("input.txt"); // Check if the file is open if (!myReadFile.is_open()) { cerr << "Unable to open the file." << endl; return 1; // Exit with an error code } // Variable declarations vector<vector<char>> maze; char ch; // Read the file character by character while (myReadFile.get(ch)) { if (ch == '\n') { // If newline character is encountered, add a new row to the maze maze.push_back(vector<char>()); } else { // Add the character to the current row maze.back().push_back(ch); } } // Close the file myReadFile.close(); // Display the contents of the maze for (int i = 0; i < maze.size(); i++) { for (int j = 0; j < maze[i].size(); j++) { cout << maze[i][j]; } cout << endl; // Add a newline after each row } return 0; }

تم تحسين الكود ليقوم بفتح الملف مباشرة باستخدام ifstream، وتم استبدال "\0" ب '\n' كشرط للخروج من الحلقة الداخلية. كما تم إضافة التحقق من نجاح فتح الملف وإظهار رسالة خطأ في حالة عدم النجاح. يتم استخدام get(ch) لقراءة الأحرف وتخزينها في المصفوفة ثنائية الأبعاد بشكل صحيح.

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

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

بالطبع، دعنا نقوم بتوسيع فهمك حول الكود المقدم وتقديم بعض النصائح للتحسين:

  1. استخدام Range-Based for Loop:
    يمكنك استخدام Range-Based for Loop لتسهيل الكود وتحسين القراءة:

    c
    for (const auto& row : maze) { for (char ch : row) { cout << ch; } cout << endl; }

    هذا يجعل الكود أقل تعقيدًا وأكثر قراءة.

  2. التحقق من نجاح القراءة:
    يمكنك التحقق من نجاح القراءة من الملف قبل بدء عمليات القراءة باستخدام if (!myReadFile):

    c
    ifstream myReadFile("input.txt"); if (!myReadFile) { cerr << "Unable to open the file." << endl; return 1; // Exit with an error code }
  3. التحقق من الحد الأقصى للمصفوفة:
    قد ترغب في التحقق من أن المصفوفة ثنائية الأبعاد لا تتجاوز حدود محددة لتجنب مشاكل الذاكرة. يمكنك إضافة تحقق بسيط بعد قراءة كل حرف:

    c
    while (myReadFile.get(ch)) { if (ch == '\n') { maze.push_back(vector<char>()); } else { maze.back().push_back(ch); } // Check for the maximum size if needed if (maze.size() > MAX_ROWS || (maze.size() > 0 && maze.back().size() > MAX_COLS)) { cerr << "Exceeded maximum size." << endl; return 1; // Exit with an error code } }

    حيث يمكنك تعيين MAX_ROWS و MAX_COLS حسب الحد الذي تحدده.

  4. توفير الطريقة للوصول إلى الأحرف بشكل منفصل:
    للوصول إلى حرف معين في المصفوفة، يمكنك إضافة دعم للوصول المباشر إلى الأحرف دون الحاجة إلى الحلقتين:

    c
    char specificChar = maze[x][y];

    حيث x هو رقم الصف و y هو رقم العمود.

  5. التعامل مع مسألة الإغلاق:
    لاحظ أنك لا تحتاج إلى إغلاق الملف يدويًا عند استخدام ifstream، حيث سيتم ذلك تلقائياً عندما تنتهي من استخدامه.

باستخدام هذه النصائح، يمكنك تحسين قراءة الملف وتخزينه في مصفوفة ثنائية الأبعاد بشكل أكثر فعالية وقراءة.

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