البرمجة

حل مشكلة قراءة الملفات في Java باستخدام Scanner

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

لحل هذه المشكلة، يمكن إجراء التغييرات التالية في الكود:

  1. استخدام متغير لتخزين القيمة المسترجعة من read2.next() في كل دورة من الحلقة.

  2. استخدام هذا المتغير في شروط الـ if للتحقق من نوع السؤال.

الكود المعدل قد يبدو كالتالي:

java
import java.util.*; import java.io.*; public class FileReader { public static void main(String[] args) throws FileNotFoundException { Scanner read = new Scanner(new File("sample.txt")); while (read.hasNextLine()) { System.out.println(read.nextLine()); } System.out.println(); Scanner read2 = new Scanner(new File("sample.txt")); int numQuestions = read2.nextInt(); System.out.println("Numbers of questions: " + numQuestions); System.out.println(); while (read2.hasNextLine()) { int points, numChoices; String question, answer; String questionType = read2.next(); // تخزين نوع السؤال في متغير if (questionType.equals("TF")) { points = read2.nextInt(); System.out.println("Points for TF: " + points); read2.nextLine(); question = read2.nextLine(); System.out.println("Question for TF: " + question); answer = read2.next(); System.out.println("Answer for TF: " + answer); } else if (questionType.equals("SA")) { points = read2.nextInt(); System.out.println("Points for SA: " + points); read2.nextLine(); question = read2.nextLine(); System.out.println("Question for SA: " + question); answer = read2.next(); System.out.println("Answer for SA: " + answer); } else if (questionType.equals("MC")) { points = read2.nextInt(); System.out.println("Points for MC: " + points); read2.nextLine(); question = read2.nextLine(); System.out.println("Question for MC: " + question); read2.nextLine(); numChoices = read2.nextInt(); for (int i = 0; i < numChoices; i++) { System.out.println(read2.nextLine()); } answer = read2.next(); System.out.println("Answer for MC: " + answer); } } } }

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

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

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

البرنامج يعتمد على فهم هيكل الملف المدخل “sample.txt”، حيث يفترض أن أول سطر في الملف يحتوي على عدد الأسئلة الكلي في الملف. بعد ذلك، يتم استخدام Scanner لقراءة الملف مرتين: المرة الأولى لطباعة جميع محتويات الملف بشكل عام، والمرة الثانية لتحليل كل سؤال بناءً على نوعه.

  1. الجزء الأول: قراءة الملف بشكل عام:
    في هذا الجزء، يتم استخدام Scanner لقراءة كل سطر في الملف وطباعته. هذا يوفر لنا نظرة عامة على محتوى الملف.

  2. الجزء الثاني: تحليل الأسئلة:
    في هذا الجزء، يتم إعادة استخدام Scanner لقراءة الملف مرة أخرى، لكن هذه المرة يتم تحليل السؤال بناءً على نوعه. يتم قراءة العدد الكلي للأسئلة أولاً، ثم يتم استخدام حلقة while لتحليل كل سؤال على حدة.

    • إذا كان السؤال من نوع “TF” (صح أم خطأ)، يتم قراءة النقاط والسؤال والإجابة.
    • إذا كان السؤال من نوع “SA” (إجابة قصيرة)، يتم قراءة النقاط والسؤال والإجابة.
    • إذا كان السؤال من نوع “MC” (اختيار من متعدد)، يتم قراءة النقاط والسؤال وعدد الخيارات، ثم يتم قراءة الخيارات وأخيراً الإجابة.

المشكلة الرئيسية في الكود الأصلي كانت في استخدام read2.next() داخل شروط الـ if دون تخزين القيمة في متغير. بتصحيح هذا الجزء، يجب أن يتمكن البرنامج الآن من تحليل الملف بشكل صحيح وطباعة جميع الأسئلة والإجابات بشكل صحيح.

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

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