4

我制作了一个解析器类来接收一个大的文本文件并做各种事情。作为这个类的成员,我有一个 ifstream 对象被定义为ifstream fin. 我有一个函数void SetFile(char* filename),它采用 c 字符串文字,应该调用fin.open()以将流连接到文件,但由于某种原因,调用fin.fail()后立即返回 true fin.open()。这是我的解析器类,希望有人注意到我做错了什么!谢谢你的时间。

解析器.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
4

1 回答 1

2

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

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

另一个可能的原因failfstream已经有一个与之关联的文件。is_open在尝试打开操作之前检查它。


来自 Drew Dormann 评论的更新:

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

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

于 2013-03-05T23:34:19.467 回答