ostream<< istream并在空文件上测试EOF,这是从istream中获取字符的替代方法

时间:2013-04-18 02:14:48

标签: c++ file-io get eof

这是我关于stackoverflow的第一篇文章,所以如果我做错了,请告诉我。下周三我将参加C ++程序设计的期末考试,我无法查看我对教授练习题的答案。我主要关心的是在将输入文件的内容复制到输出文件之前检查输入文件是否为空。另外,从输入文件中获取字符。以下是问题和我的代码:

假设我们有以下枚举类型来列出可能的文件I / O错误:

enum FileError {
   NoFileError,       // no error detected
   OpenInputError,    // error opening file for input
   OpenOutputError,   // error opening file for output
   UnexpectedFileEnd, // reached end-of-file at unexpected spot in program
   EmptyFileError,    // file contained no data
};

为以下三个文件处理例程提供适当的实现:

FileError OpenInputFile(ifstream& infile, char *filename);
// open the named file for input, and return the opening status

FileError OpenOutputFile(ofstream& outfile, char *filename);
// open the named file for output, and return the opening status

FileError CopyNChars(ifstream& infile, ofstream& outfile, int NumChars);
// check to ensure the two files are open,
//    then copy NumChars characters from the input file to the output file

现在我主要关注这里列出的最后一个功能。这是我的代码:

FileError CopyNChars(ifstream& infile, ofstream& outfile, int NumChars){
    char c;
    if (!infile.is_open()) return 1;
    if (!outfile.is_open()) return 2;
    if ((infile.peek()) == -1) return 4; //This right? (I'm using linux with g++ compiler.
    // Also, can I return ints for enum types?
    for (int i = 0; i < NumChars; i++){
        if (infile.eof()) return 3;
        else {
            infile.get(c); //Is this the way to do this?  Or is there another recommendation?
            outfile << c;
        }
    }
}

我在阅读之前已经查看了各种检查EOF的方法,但是我没有找到-1或EOF的SPECIFIC答案是有效的检查(类似于NULL ???)。我认为这只是我对术语的不熟悉,因为我查看了文档,我找不到这种检查的 EXAMPLE 。我在这里正确检查空文件吗?我没有编写驱动程序来测试此代码。另外,我担心我正在使用的get方法。在这种情况下是否有替代方案,一次获得一个角色的最佳方式是什么。最后,我是否可以在堆栈溢出时询问一些推测性问题(比如“在这种情况下获取的最佳方法是什么,以及什么是最好的?”)。感谢您的时间和考虑。

1 个答案:

答案 0 :(得分:0)

检查cplusplus.com。它有一些使用ifstream的好例子:http://www.cplusplus.com/reference/fstream/ifstream/

特别是,您可能想要查看没有参数的get()函数。如果击中EOF,则返回EOF。此外,ifstream还有一个eof()函数,可以告诉你是否设置了eof位。另外,我不知道你是否保证检查peek()的返回值。 CSTDIO定义了EOF宏,通常为-1,但我不认为它是由语言保证的。

此外,我不会返回整数值,而是返回枚举文字。这就是他们的目的。