Read input from a file, capitalize first letter, make every other letter lowercase, and output into a separate file

前端 未结 2 945
無奈伤痛
無奈伤痛 2021-01-21 20:36

I am supposed to ask the user for two file names (input and output files). The contents from the input file should be read and the first letter of each sentence should be made u

2条回答
  •  慢半拍i
    慢半拍i (楼主)
    2021-01-21 20:53

    You have a minor logical error.

    You first need to check, if the character is a period. This state you need to remember. If then a next character isalpha, then we check, if recently the newsentence flag has been set. In this case, and only in this case, we reset the new sentence flag and convert the character to uppercase.

    All other alpha characters will be converted to lowercase. Other charcaters will not be converted.

    In your solution you always reset the newsentence flag. Even, if the next print character is a space (Which is most liekly the case).

    Please see updated solution:

    #include 
    #include 
    #include 
    #include 
    using namespace std;
    
    int main() {
        string input_file;  // To hold input file name
        string output_File; // To hold output file name
        char ch;            // To hold character
        fstream inputFile;
        fstream outputFile;
    
        bool new_sentence = true;
    
        cout << "Enter input file name: " << endl;
        cin >> input_file;
    
        cout << "Enter output file name: " << endl;
        cin >> output_File;
    
        outputFile.open(output_File, ios::out);
        inputFile.open(input_file, ios::in);
    
        if (inputFile) {
            while (inputFile.get(ch)) {
                if (ch == '.') {
                    new_sentence = true;
                }
                if (isalpha(ch)) {
                    if (new_sentence) {
                        ch = toupper(ch);
                            new_sentence = false;
                    }
                    else {
                        ch = tolower(ch);
                    }
                }
                outputFile.put(ch);
            }
            inputFile.close();
            outputFile.close();
        }
        else {
            cout << "Cannot open file(s)." << endl;
    }
    
        cout << "\nFile conversion complete." << endl;
    
        return 0;
    }
    

    And then, please see some further improvements:

    #include 
    #include 
    #include 
    #include 
    
    
    int main() {
        // Will hold the input and output filename
        std::string filename;  
    
        // This is our flag to indicate that a new sentence will come
        bool newSentence = true;
    
        // Get input filename
        std::cout << "Enter input file name: " << "\n";
        std::cin >> filename;
        // And try to open the file
        std::ifstream inFile(filename);
    
        std::cout << "Enter output file name: " << "\n";
        std::cin >> filename;
        // And try to open the file
        std::ofstream outFile(filename);
    
        // Only convert, if the input and output file could be opened 
        if (inFile && outFile) {
            char ch;
            while (inFile.get(ch)) {
                if (ch == '.') {
                    newSentence = true;
                }
                if (isalpha(ch)) {
                    if (newSentence) {
                        ch = toupper(ch);
                        newSentence = false;
                    }
                    else {
                        ch = tolower(ch);
                    }
                }
                outFile.put(ch);
            }
        }
        else {
            std::cout << "Cannot open file(s)\n";
        }
        std::cout << "\nFile conversion program complete\n";
        return 0;
    }
    

    And the full blown "C++ with algorithm" solution. Here the conversion, or transformation is done in one statement

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    int main() {
        // Will hold the input and output filename
        std::string filename;  
    
        // Get input filename
        std::cout << "Enter input file name: " << "\n";
        std::cin >> filename;
        // And try to open the file
        std::ifstream inFile(filename);
    
        std::cout << "Enter output file name: " << "\n";
        std::cin >> filename;
        // And try to open the file
        std::ofstream outFile(filename);
    
        // Only convert, if the input and output file could be opened 
        if (inFile && outFile) {
            // Do the conversion
            std::transform(
                std::istreambuf_iterator(inFile), 
                std::istreambuf_iterator(),
                std::ostreambuf_iterator(outFile),
                [newSentence = true](char c) mutable {
                    if (c == '.') newSentence = true; 
                    if (std::isalpha(c)) 
                        if (newSentence) { 
                            newSentence = false; 
                            c = std::toupper(c); }  
                        else c = std::tolower(c); 
                    return c;
                }
            );
        }
        else {
            std::cout << "Cannot open file(s)\n";
        }
        std::cout << "\nFile conversion program complete\n";
        return 0;
    }
    

    But if the last solution adds additional value? I am not sure . . .

提交回复
热议问题