正确使用ifstream对象作为类的成员

时间:2013-03-05 23:26:13

标签: c++ class parsing ifstream

我已经创建了一个解析器类来接收大量文本文件并执行各种操作。作为这个类的成员,我有一个ifstream对象delcared为ifstream fin。我有一个函数void SetFile(char* filename),它接受​​一个c字符串文字并且应该调用fin.open()来将流连接到文件,但由于某种原因,fin.fail()在紧接着之后立即返回true fin.open()致电。这是我的解析器类,希望有人注意到我做错了什么!谢谢你的时间。

Parser.h

#ifndef PARSER_H
#define PARSER_H
#include <fstream>
#include <cstdlib>
#include "Heap.h"
#include "Word.h"

enum FILESTREAM_ERRORS{OPEN_ERROR};

class Parser
{
public:
    Parser();
    void SetFile(const char *filename);
    void LoadHeap();

//private:
    int word, line, paragraph;
    ifstream fin;
    Heap<Word> *wordheap;
    void LoadWord();
};

Parser::Parser()
{
    word = line = paragraph = 0;
}

void Parser::SetFile(const char* filename)
{
    fin.open(filename);
    if(fin.fail())
        throw OPEN_ERROR;
}

void Parser::LoadWord()
{
    QString wordstring;
    char c;
    fin.get(c);
    if (c == '\n')
    {
        char p = fin.peek();
        if (p == '\n')
        {
            fin.get(c);
            paragraph++;
        }
        line++;
        fin.get(c);
    }
    while (isblank(c))
        fin.get(c);
    while (!isblank(c))
        wordstring.append(c);
    word++;
    cout << qPrintable(wordstring) << endl;
}

#endif // PARSER_H

1 个答案:

答案 0 :(得分:2)

检查您的文件是否存在,以便您可以有效地阅读它。

激活std::ios exceptions以获取有关错误的更多信息。

fail的另一个可能原因是fstream已经有一个与之关联的文件。在尝试打开操作之前,请先使用is_open进行检查。


来自Drew Dormann的评论评论:

如果指定相对路径,即非绝对路径(通常以Windows上的驱动器号或* nix上的斜杠开头),则应考虑当前工作目录的值(CWD)。此值通常默认为可执行文件的目录,但某些操作系统或IDE可能会更改它,当然您的程序也可以更改它。

因此,如果你使用相对路径,也要检查CWD(可以在* nix上使用getcwd获取它,或者出于测试目的使用绝对路径。