正确使用ifstream对象作为类的成员
Proper Use of an ifstream Object as a Member of a Class
我制作了一个解析器类,用于接收大的文本文件并执行各种操作。作为这个类的成员,我有一个声明为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
获得它),或者出于测试目的使用绝对路径。
相关文章:
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 在运行时有条件地删除类成员或跳过调用该成员对象的构造函数
- C++是否有定义的方法来传递指向类的成员对象的成员函数的指针
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 声明成员对象而不调用其默认构造函数
- 指向成员对象的指针 - 中断线程
- 是否有更好的方法来封装成员对象可以访问的共享存储池?
- 应该在成员对象上调用析构函数
- 调用成员对象的构造函数
- 将 const 类型引用对象注册为类成员对象C++
- 修改类 c++ 中的成员对象
- 从成员对象调用方法
- 从对象调用成员对象,错误:引用非常量值的初始值必须是左值
- 构造函数,成员对象
- 不能使外部类成为内部类内的成员对象
- 使用从另一个类继承的类的对象初始化成员对象
- 如何避免需要在初始化列表中初始化成员对象
- 初始化具有参数的类成员对象的正确方法
- 将指针添加到成员对象中的指针动态阵列
- C 将成员对象函数分配给类成员功能