使用打印功能输出到新文件

Using a print function to output to a new file

我有一个程序可以分析文本文件中不同单词的数量和总单词数,然后将其写入新的输出文件。我已经记下了第一部分,但我不知道如何让我的打印功能打印到新的文本文件上。将总字数或不同的字打印到新文件上是可行的,但 Print2() 函数似乎不起作用。请查看 //POINT OF INTEREST// 部分,我认为问题出在这里。

#include <iostream>
#include <fstream>
#include <string>
#include <cctype>
int distinctWord = 0;
using namespace std;

typedef int ItemType;

struct Node {
    string word;
    int count = 1;
    Node* left;
    Node* right;
};

class TreeType {
private:
    Node* root;
    void Insert(Node*& root, string word);
    void Destroy(Node*& root);
    void PrintTree(Node* root);
    void Print2File(Node* root, ofstream& fout);
public:
    TreeType() {root = nullptr;}
    ~TreeType();
    void PutItem(string word);
    void Print();
    void Print2(ofstream& fout);
};

void TreeType::Print() {
    PrintTree(root);
    cout << endl;
}

void TreeType::PrintTree(Node* root) {
    if (root == nullptr)
        return;
    PrintTree(root->left);
    cout << root->word << " " << root->count << endl;
    PrintTree(root->right);
}
///////////////POINT OF INTEREST///////////////////////////
///////////////POINT OF INTEREST///////////////////////////

void TreeType::Print2File(Node* root, ofstream& fout){
    if (root == nullptr)
        return;
    PrintTree(root->left);
    fout << root->word << " " << root->count << endl;
    PrintTree(root->right);
}

void TreeType::Print2(ofstream& fout) {
    Print2File(root, fout);
    cout << "Printed to another file" << endl;
}

///////////////POINT OF INTEREST///////////////////////////
///////////////POINT OF INTEREST///////////////////////////

void TreeType::PutItem(string word) {
    Insert(root, word);
}

void TreeType::Insert(Node*& root, string word) {
    if (root == nullptr) {
        root = new Node;
        distinctWord++;
        root->word = word;
        root->right = nullptr;
        root->left = nullptr;
        return;
    }
    if(root->word == word){
        root->count++;
        return;
    }else if (word < root->word)
        Insert(root->left, word);
    else
        Insert(root->right, word);
}

TreeType::~TreeType() {
    Destroy(root);
}

int main(int argc, const char * argv[]) {
    int totalwords = 0;
    ifstream file;
    string word;
    char c;
    ofstream fout;

    ifstream file;
    string filename;
    cout << "Enter name of file with text to analyze: ";
    cin >> filename;
    fin.open(filename.c_str());
    if (fin.fail()) {
        cout << "Error opening file.\n";
        exit(1);
    }
    cout << "\nAnalyzing " << filename << ".\n";

    TreeType t;

    while(!file.eof()){
        file.get(c);

        if(isalpha(c) || c == '\''){
            word += c;
            c = '[=10=]';
        }else if(c == ' ' || c == '\n' || c == '-' || c == '.'){
            if(isalpha(word[0])){
                transform(word.begin(), word.end(), word.begin(), ::tolower);
                t.PutItem(word);
                totalwords++;
                word = "";
                c = '[=10=]';
            }
        }

    }if(isalpha(word[0])){
        transform(word.begin(), word.end(), word.begin(), ::tolower);
        t.PutItem(word);
        totalwords++;
    }

    file.close();
    fout.open("results.txt");
    cout << "\nWord counts:\n\n";
    t.Print();
    t.Print2(fout);
    cout << "\nTotal number of words in text: " << totalwords << ".\n";
    fout << "\nTotal number of words in text: " << totalwords << ".\n";
    cout << "Number of distinct words appearing in text: "
        << distinctWord << ".\n";
    fout << "Number of distinct words appearing in text: "
        << distinctWord << ".\n";
    fout.close();
    return 0;
}

您必须将输出文件流传递给您的 PrintTree(root); 也是。

现在您正在打印到 cout,这会将所有内容转储到您的应用程序关联的任何控制台。

添加ofstream参数后修改后的函数变为:

void TreeType::PrintTree(Node* root, ofstream &fout) {
    if (root == nullptr)
       return;
    PrintTree(root->left, fout);
    fout << root->word << " " << root->count << endl;
    PrintTree(root->right, fout);
}

您需要在 PrintTree

的所有调用者中始终传递 ofstream 对象