简体   繁体   English

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

[英]Using a print function to output to a new file

I have a program analyzing the number of distinct and total words in a text file and then writing it to a new output file. 我有一个程序可以分析文本文件中不同单词和总单词的数量,然后将其写入新的输出文件。 I've got the first part down, but I don't know how to get my print function to print onto the new text file. 我已经完成了第一部分的工作,但是我不知道如何使我的打印功能打印到新的文本文件上。 Printing the total words or distinct words onto the new file works but the Print2() function doesn't seem to work. 将总单词或不重复单词打印到新文件上可以,但是Print2()函数似乎不起作用。 Please take a look at the //POINT OF INTEREST// section, where i believe the problem stems. 请查看//兴趣点// ,我认为问题出在这里。

#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 = '\0';
        }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 = '\0';
            }
        }

    }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;
}

You will have to pass your output file stream to your PrintTree(root); 您将必须将输出文件流传PrintTree(root); too. 太。

Right now you are printing to cout which will dump everything to whatever console your application is associated with. 现在,您正在打印到cout ,它将把所有内容转储到与您的应用程序关联的任何控制台。

The modified function after adding the ofstream parameter becomes: 添加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);
}

You will need to pass the ofstream object throughout in all callers of PrintTree 您将需要在所有PrintTree调用PrintTree传递ofstream对象

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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