Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

C++ ofstream write in file from input, without new line after each word

Basically I have a function, that writes into a .txt file.
The user has to input, what will be written in the file.
The problem is, every word has a new line, even tho it’s written in the same line, while doing the input.
But I want it to be the way the user inputs it.

    void Log_Write::WriteInLog(std::string LogFileName)
{
    system("cls");
    std::string input;
    std::ofstream out;
    out.open(LogFileName, std::fstream::app);
    out << "\n\nNEW LOG ENTRY: " << getCurrentTime()<<"\n"; // 
    while (true)
    {
        system("cls");
        std::cout << "Writing in Log\n\nType 'x' to leave editor!\n\nInsert new entry: ";
        std::cin >> input;
        if (input == "x")
            break;
        out << input << "\n"; // How do I change this so it doesn't create a new line for each word
    }
    out.close();
}

Sample Input:

1st Input:Test Input

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

2st Input:Next input

Sample Output in file.txt:

Test

Input

Next

Input

(Without the spaces in between!)

>Solution :

std::cin >> input; just reads to the first whitespace while std::getline(std::cin, input); would read the whole line.

One way of fixing it:

while(
    system("cls"),
    std::cout << "Writing in Log\n\nType 'x' to leave editor!\n\nInsert new entry: ",
    std::getline(std::cin, input)
) {
    if (input == "x")
        break;
    out << input << '\n';
}

I put the std::getline call last in the while condition to make the loop exit if std::getline fails.


Now, the above looks pretty nasty so I suggest putting clearing the screen and prompting the user in a separate function instead.

Example:

#include <iostream>
#include <string>
#include <string_view>

std::istream& prompt(std::string_view prompt_text, std::string& line,
                     std::istream& in = std::cin,
                     std::ostream& out = std::cout) {
    std::system("cls");
    out << prompt_text;
    std::getline(in, line);
    return in;
}

void Log_Write::WriteInLog(std::string LogFileName) {
    // ...

    auto prompt_text = "Writing in Log\n\n"
                       "Type 'x' to leave editor!\n\n"
                       "Insert new entry: ";
    
    while (prompt(prompt_text, input)) {
        if (input == "x") break;
        out << input << '\n';
    }
}
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading