0

私は次のクラス定義を持っています...そして、fstreamオブジェクトについて疑問に思っています。

#ifndef CLIENTLIST_H
#define CLIENTLIST_H
#include <string>
#include <vector>
#include <fstream>
using namespace std;

class ClientList
{
private:
// A structure for the list
struct ListNode
    {
        char gender;
        string name;
        string phone;
        int numInterests; // The number of interests for the client
        vector<string> interests; // list of interests
        string match;
        struct ListNode *next;  // To point to the next node
    }; 

    ListNode *head;            // List head pointer
    string name;

    void detach(string); // to unmatch the corresponding client

public:
    // Constructor
    ClientList();

    // Destructor
    ~ClientList();

    // Linked list operations
    void appendNode(char, string, string, int, vector<string>, string, fstream &);
    string interestCompare(vector<string>, string, fstream &);
    void unmatch(string, ClientList, fstream &);
    void printMatch(fstream &);
    void printFree(fstream &);

};
#endif

これは、クラスで fstream オブジェクトを使用しようとした 5 番目の方法ですが、どれも機能せず、さまざまな種類のエラーが発生しました。

これは、私が最近実装している関数の例です

//**************************************************
// appendNode appends a node containing the        *
// value pased into num, to the end of the list.   *
//**************************************************
void ClientList::appendNode(char gen, string nm, string ph, int numIntr, 
                            vector<string> intr, string mch, fstream &dates)
{
    dates.open("dates.txt", ios::out | ios::out);
    ListNode *newNode;  // To point to a new node
    ListNode *nodePtr;  // To move through the list

    // Allocate a new node and store data in it.
    newNode = new ListNode;
    newNode->gender = gen;
    newNode->name = nm;
    newNode->phone = ph;
    newNode->numInterests = numIntr;
    newNode->interests = intr;
    newNode->match = mch;
    newNode->next = NULL;

    // If there are no nodes in the list
    // make newNode the first node.
    if (!head)
        head = newNode;
    // Otherwise, insert newNode at end.
    else  
    {
        // Initialize nodePtr to head of list.
        nodePtr = head;

        // Find the last node in the list.
        while (nodePtr->next)
            nodePtr = nodePtr->next;

        // Insert newNode as the last node.
        nodePtr->next = newNode;
    }

    dates << "\nClient: " << newNode->gender << ", " << newNode->name << ", "
          << newNode->phone << ", " << newNode->numInterests << ", ";
    for (int index = 0; index < newNode->numInterests; index++)
        dates << newNode->interests[index] << ", ";
    dates << newNode->match << ".\n";



    cout << "\n\nAPPENDED\n\n";
    dates.close();
}

これは main() から呼び出す方法の例です

//append to file
    if (gender == tolower('m'))
    {       

        match = Female.interestCompare(interests, name, dates); // compare the vector of interests to the client interests
        // in the female list

        Male.appendNode(gender, name, phone, numInterests, interests, match, dates);        
    }

しかし、私が言ったように、これは私の試みの 1 つにすぎず、どのようにクラスにファイルを開いて書き込みさせようとしても、プログラムがクラッシュするか、事後条件ではない何かを実行するようです。

それで、クラス内でファイルストリームを使用することさえ可能かどうか疑問に思っています。もしそうなら、それを行うために何を保持する必要がありますか。

注: 必ずしも特定の実装を探しているわけではありません。実装の背後にある「理由」に興味があります。将来、自分が何をしているのかを知ることができるように、心に留めておく必要があることを知りたい.

4

1 に答える 1

1

それは可能であるべきです。

渡した fstream に問題がある可能性があります。'dates' を再確認してください。

fstream は、ios から fail() を継承します。fstream が正常かどうかを確認するために使用できます。is_open() を使用して、ファイルが適切に開かれたかどうかを確認できます。

#include <assert.h>

// stuff...
fstream dates("dates.txt", fstream::in | fstream::out);
if (dates.is_open())
{
    cout << "dates.txt opened ok" << endl;
}
dates.close();

if (gender == tolower('m))
{
    assert(dates.fail() == false);

    match = Female.interestCompare(interests, name, dates);

    assert(dates.fail() == false);

    Male.appendNode(gender, name, phone, numInterests, interests, match, dates);        
}

少なくとも失敗すると、行番号が表示され、そこからデバッグできます。

また、2番目のios::outを変更するつもりだったと思います

ClientList::appendNode(...)
{
    //dates.open("dates.txt", ios::out | ios::out);
    dates.open("dates.txt", ios::in | ios::out | ios::app);
    ...
}
于 2013-01-28T23:42:05.013 に答える