0

这是我在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 是有效检查的具体答案(类似于 NULL???)。我认为这只是我对术语的不熟悉,因为我查看了文档,但找不到这种检查的示例。我在这里正确地进行空文件检查吗?我没有编写驱动程序来测试此代码。另外,我担心我正在使用的 get 方法。在这种情况下是否有其他选择,以及一次获得一个角色的最佳方法是什么。最后,我是否可以提出关于堆栈溢出的推测性问题(例如“有哪些获取方法以及在这种情况下最好的方法是什么?”)。感谢您的时间和考虑。

4

1 回答 1

0

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

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

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

于 2013-04-18T08:10:41.523 回答