2011-03-30 76 views
0

如果一个程序试图使用我的文件读取类访问不存在的文件的一部分(即在ios_base :: end之后),应该抛出什么异常?文件的异常处理

我打算使用std :: out_of_range,但现在我开始认为std :: runtime_error会更合适。

编辑:

接口工作有点不同比标准fstream类,它是基于各地for循环,而不是while循环。因此,而不是执行以下操作:

while (MyFile.peek() != EOF) 
{ 
    char Character = MyFile.get(); 
    // Do stuff with Character. 
} 

类的用户可以这样做:

for (std::streampos Pos = 0; Pos < MyFile.GetCharCount(); Pos++) 
{ 
    char Character = MyFile.GetChar(Pos); 
    // Do stuff with Character. 
} 

回答

1

如果你正在提供一个类似数组的界面(使用operator [],而不是 比get),那么抛出std::out_of_range是个好主意;在这种情况下,更好的 想法可能是找出您实际可以访问多少个字节,提供一个size()函数,并将 作为前提条件。 (当然,要提供像这样的随机访问,你必须要将整个文件读入内存,不能 在文本文件中随机寻找任意位置,Unix下的 除外)。

如果您提供的是类似界面的文件,那么设置错误状态 (如iostream)就是首选解决方案。

如果你不提供,这全是你提供什么样的问题,以及用户对它的期望是什么,或者应该是什么。

5

不要抛出异常,不喜欢的标准库确实并设置“最终的文件“标志。只有抛出一个异常,如果它真的超级破坏意外的发生了一些事情。

+0

看我的编辑;在这种情况下,EOF标志没有意义。 – Maxpm 2011-03-30 17:18:31

+1

@Maxpm:那更像是你有一个'char'数组,是吧?那么你有一些可能性:只要不允许它,抛出一个异常,就像你最初的建议一样,在这种情况下'out_of_range'更适合,或者只是返回'EOF'字符。或者甚至可能只是返回数组中的最后一个字符。 – Xeo 2011-03-30 17:22:06

1

他们是如何越过文件末尾的阅读点?如果他们只是阅读文件的末尾,然后继续阅读,我只需发信号给EOF。如果他们试图超越档案的末尾,那么寻找的尝试就会失败,所以他们从来没有到过试图从那里读取的地步。

然而,我不会模仿正常的iostreams太密切。特别是,当/如果读数到达文件的末尾,我会而不是设置一个“粘性”位,以防止在文件被清除之前进一步读取文件。在一个进程中编写一个文件并在另一个进程中读取文件是非常合理和正常的,因此到达文件结尾可能是一个临时条件。

+0

该接口具有类似于'GetChar()'和'GetLine()'的函数,它们以'std :: streampos'参数的形式进行定位。我还包含'GetCharCount()'和'GetLineCount()'函数,因此可以很容易地在'for'循环中读取文件,而不是'while'循环。 (即用'CurrentPos Maxpm 2011-03-30 17:11:14

+1

@Maxpm:听起来好像你让它们几乎像随机访问集合一样处理文件。在这种情况下,我认为'out_of_range'可能是更有意义/合适的选择。 – 2011-03-30 17:18:12