简体   繁体   中英

C++ ostream parameters

I am building a project that solves a boggle board. The two functions I'm interested in at the moment are

void Boggle::SolveBoardHelper(bool printBoard, int row, int column, int rowMax, int columnMax,
                              ofstream& output, int numSteps, int steps[4][4], string currPath)


void Boggle::SolveBoard(bool printBoard, ostream &output) {
    ofstream outputFile;
    outputFile(output); // stuck here
    string currPath; // used to track the current path on the board

    for(int pos_x = 0; pos_x < BOARD_SIZE; pos_x++){
        for(int pos_y = 0; pos_y < BOARD_SIZE; pos_y++)
            SolveBoardHelper(print_or_not, pos_x, pos_y, BOARD_SIZE, BOARD_SIZE, outputFile, numSteps, visited, currPath);
    }  

}

My area of confusion is that when the user calls SolveBoard to solve a board, they have the option of passing "cout" or an output file into the ostream parameter. If the user decides to call the function and pass in an output file, say "output.txt", how do I account for this? How do I take the output file passed into the SolveBoard parameter by the user, and then plug that into the SolveBoardHelper function so that I can write to that file after the board has been solved?

My previous attempt included me just passing a predetermined output file into the parameter, but I don't know what file the user will choose to output to:

void Boggle::SolveBoard(bool printBoard, ostream &output) {
   
    string outputFile = "solve_output_test.txt"; // write to the already created solve_output_test.txt file
    ofstream outFile(outputFile); // assign it to ofstream variable outFile
    if(!outFile){
        cout << "Error opening file" << endl; // file open check
    }
    string currPath; 
    
    for(int pos_x = 0; pos_x < BOARD_SIZE; pos_x++){
        for(int pos_y = 0; pos_y < BOARD_SIZE; pos_y++) 
            SolveBoardHelper(print_or_not, pos_x, pos_y, BOARD_SIZE, BOARD_SIZE, outFile, numSteps, visited, currPath);
    }   
}
void Boggle::SolveBoard(bool printBoard, ostream &output) {
    // remove the two lines below and just use `output` in the rest of the function:
    //ofstream outputFile; 
    //outputFile(output);
    
    for(int pos_x = 0; pos_x < BOARD_SIZE; pos_x++) {
        for(int pos_y = 0; pos_y < BOARD_SIZE; pos_y++)
            SolveBoardHelper(print_or_not, pos_x, pos_y, BOARD_SIZE, BOARD_SIZE, output,
                             numSteps, visited, currPath);
    }  
}

Then call the function with

SolveBoard(the_bool, std::cout);

or

std::ofstream file("output.txt");
SolveBoard(the_bool, file);

You also need to redefine SolveBoardHelper to take an ostream instead:

void Boggle::SolveBoardHelper(bool printBoard, int row, int column, int rowMax,
                              int columnMax, ostream& output, int numSteps,
                              int steps[4][4], string currPath)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM