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

Proper Use of an ifstream Object as a Member of a Class

本文关键字:成员 对象 ifstream      更新时间:2023-10-16

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

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

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

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

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


来自Drew Dormann评论的更新:

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

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