السلام عليكم ورحمة الله وبركاته.

أقوم حالياً بإنشاء برنامج يقوم بقرائة ملف نصّي ، ويحفظه في dynamically allocated ragged array of characters ، وقمت بالفعل بهذه العملية حيث قمت بحفظ النص line by line -وهو شرط أساسي- ، وقمت بإنشاء 2d array يحوي على عدد الكلمات لكل سطر ، واستخدمت في هذه العملية cstring strtok.

المشكلة التي اواجهها هي ثلاثة أشياء ، الأولى انشاء function تقوم بالبحث عن كلمة معينة وتحديد موقعها من حيث السطر ، وموقعها من حيث الكلمة (مثالاً الكلمة الخامسة في السطر الرابع). استخدمت strstr لتحديد رقم السطر ، ولكن رقم الكلمة فالسطر لم اعلم بالطريقة ، فحتى strtok التي استخدمتها لمعرفة عدد الكلمات لم تُفد لانها في كل مرة تُرجع مؤشّر لأول حرف من كل كلمة فالسطر!

من ثم عملية الإستبدال التي تستبدل كلمة بأخرى بحيث تستعمل نتائج عملية البحث في عملية الإستبدال.

وعملية الحذف كذلك تستخدم نتائج عملية البحث.

للمعلومة فإن نتائج عملية البحث من المفترض ان يتم تخزينها في dynamic array لكل نتيجة (رقم السطر الموجود به الكلمة ، و موقع الكلمة فالسطر).

هذه عملية القرائة الخاصة بي :



string file_name;
// ask the user to enter the name of the file:
cout << "\n Please enter the name of your file :  ";
cin >> file_name;
// open the file:
ifstream data;
data.open(file_name.c_str());
// check if the file is open or not:
if (!data)
{
    cout << " \n \a Error while open the file \n";
    return false;
    exit(0);
}
// now declare the dynamic arrays:
char ** temp_lines = 0; // to help us when we add lines.
char buffer_line[1000]; // this is to save the line and know its size.

do // loop reading untel end of the file, every time we add a new line.
{
    temp_lines = new char *[num_lines + 1]; // we add a new line for the array to save the line.

    // now we have temp that have a place for the new line, we need to save the old data on it:
    for (int i = 0; i < num_lines; i++)
        temp_lines[i] = lines[i];

    // now our array is ready to save the new line in it:
    data.getline(buffer_line, 1000, '\n');


    // we have the line , now alocate a memory for it:
    temp_lines[num_lines] = new char[strlen(buffer_line)];

    // now after we alocated the memory, we save the data in it:
    strcpy(temp_lines[num_lines], buffer_line);

    //now we will delet the DATA in the real array:
    delete[] lines;

    // we have the array lines and its emoty, and the temp array that have the data, just copy:

    lines = temp_lines;

    // Increment the number of names:

    num_lines++;

} while (!data.eof()); // if its NOT end of file.



//--------------------------------------------------------------------------------------------------------------------
// find number of words in the file:

string word;

// first thing we will brock our line into words, and acount the words to know how many words in the line:

num_words_line = new int[num_lines]; // the size = number of line.
for (int i = 0; i < num_lines; i++)
{
    // i will use cstring strtok:

    char * words_line = new char[strlen(lines[i])];// i use this pointer to pointer to save the line it it, so
    // i can work withaout make a chang on the oregnal data.
    strcpy(words_line, lines[i]);

    int num_words_per_line = 0; // every time read a line, it will reset the counter of words.
    char * words;
    words = strtok(words_line, " ,.-");
    while (words != NULL)
    {
        words = strtok(NULL, " ,.- \0");
        num_words_per_line++;   // compute the number of words per line.
    }
    total_words = total_words + num_words_per_line;
    num_words_line[i] = num_words_per_line; // save the number of words in the array.
}

// display a message contain : number of lines, number of words per line, total words.
cout << " \n \aReading is successful!!";
cout << "\n ===========================\n"
    << " number of lines is : " << num_lines
    << " With total words : " << total_words << endl << endl;
for (int i = 0; i < num_lines; i++)
{
    cout << " \nLine " << i + 1 << "\tcontain  " << num_words_line[i] << "\t words ";
}
cout << " \n=================================================\n";


return true;