我已经创建了一个解析器类来接收大量文本文件并执行各种操作。作为这个类的成员,我有一个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
答案 0 :(得分:2)
检查您的文件是否存在,以便您可以有效地阅读它。
激活std::ios
exceptions以获取有关错误的更多信息。
fail
的另一个可能原因是fstream
已经有一个与之关联的文件。在尝试打开操作之前,请先使用is_open
进行检查。
来自Drew Dormann的评论评论:
如果指定相对路径,即非绝对路径(通常以Windows上的驱动器号或* nix上的斜杠开头),则应考虑当前工作目录的值(CWD)。此值通常默认为可执行文件的目录,但某些操作系统或IDE可能会更改它,当然您的程序也可以更改它。
因此,如果你使用相对路径,也要检查CWD(可以在* nix上使用getcwd
获取它,或者出于测试目的使用绝对路径。