(C ++) Есть ли причина не работать с открытым файлом? - PullRequest
0 голосов
/ 06 мая 2020

При написании небольшого фрагмента кода обработки текста я понял, что с использованием обозначений, которые я использовал, можно было бы просто выполнять всю мою обработку при импорте, что сократит весь цикл в пределах l oop. Однако это означало бы, что мой код будет много обрабатывать, пока файл открыт, используя данные из указанного файла, и мой инстинкт подсказывает, что правильным программистам может быть что сказать по этому поводу (хотя с такой же легкостью вы можете не так как я еще только студент).

По сути, я хочу превратить это (обратите внимание, что код незакончен) ...

int minPalindromeSteps(std::string input) {
    //Step 1: Import a list of palindromes from a file
    //Note: the file is assumed to be encoded in standard ASCII and all lowercase, this code is not generalized for unicode
    set<string> Palindromes {};
        {//Open a new scope so that temp variables end sooner
        string word {};
        std::ifstream word_file;
        word_file.open("palindromes.txt");
        if (!word_file.is_open())throw std::runtime_error("Error: File opening failed.");
        while (word_file >> word){//Recall: >> operator delineates using whitespace
            if ( input == word ) return 0;//if the word is already a palindrome
            else Palindromes.insert(word);
        }
        word_file.close();
        }//End dummy scope

    //Step 2: Determine which words (if any) are the "potential palindrome"
    set<string> shortlist {};
    for (auto& word: Palindromes){//note: everthing inside this loop could be moved to the while above, but my gut tells 
                                 //me not to do operations directly to an open file
        bool shortlisted = true;//reset the shorlist flag to true
        for (unisgned i {0}; i < input.length(); i++){
            if ( input.at(i) != word.at(i) ){
                shortlisted = false;
                break;
            }//end if
        }//end for 2
        if (shortlisted) shortlist.insert(word);
    }// end for 1
}

в это:

int minPalindromeSteps(std::string input) {
    //Step 1: Import a list of palindromes from a file
    //Note: the file is assumed to be encoded in standard ASCII and all lowercase, this code is not generalized for unicode
    set<string> shortlist {};//THIS WAS RENAMED
        {//Open a new scope so that temp variables end sooner
        string word {};
        std::ifstream word_file;
        word_file.open("palindromes.txt");
        if (!word_file.is_open())throw std::runtime_error("Error: File opening failed.");
        while (word_file >> word){//Recall: >> operator delineates using whitespace
            if ( input == word ) return 0;//if the word is already a palindrome
            else {//EVERYTHING WAS MOVED INTO THIS ELSE
                bool shortlisted = true;//reset the shorlist flag to true
                for (unisgned i {0}; i < input.length(); i++){
                    if ( input.at(i) != word.at(i) ){
                        shortlisted = false;
                        break;
                    }//end if
                }//end for
                if (shortlisted) shortlist.insert(word);
            }
        }
        word_file.close();
        }//End dummy scope

    //Step 2: Determine which words (if any) are the "potential palindrome"

    for (auto& word: Palindromes){
        /* EVERYTHING WAS MOVED ABOVE */
    }// end for 1
}

... и мне интересно, есть ли какой-то принцип кодирования, невысказанное правило или тому подобное, чтобы не работать с открытыми файлами слишком долго, или это просто зависит от личных предпочтений и читабельности кода.

...