2016-10-25 18 views
-2

私たちは整数のファイルを持っています。各行には整数があります。ファイルを調べ、最小と最大の整数を見つけなければなりません。何をすべきかはっきりしていますが、ファイルが空の場合に問題があります。ファイルの終わりのチェックが機能しません(C++)

#include <iostream> 
#include <fstream> 
using namespace std; 

void calculateMinMax(ifstream& inputStream, int& minNum, int& maxNum) 
{ 
    string currLine; 
    if(inputStream.ios::eof()) // code never enters this, even if file is empty !??? 
    { 
    throw "EmptyFileException"; 
    } 

    int currNum; 

    inputStream >> minNum; 
    maxNum = minNum; 

    while(getline (inputStream, currLine)) 
    { 
    inputStream >> currNum; 

    if(currNum > maxNum) 
    { 
     maxNum = currNum; 
    } 

    if(currNum < minNum) 
    { 
     minNum = currNum; 
    } 
    } 

    inputStream.close(); 
} 

int main() 
{ 
    int currNum, minNum, maxNum; 
    ifstream inputStream("numberFile.txt"); 

    try 
    { 
    calculateMinMax(inputStream, minNum, maxNum); 
    cout << "Min: " << minNum << endl; 
    cout << "Max: " << maxNum << endl; 
    } 
    catch(...) 
    { 
    cout << "File is empty" << endl; 
    } 

    return 0; 
} 

probelemは、私はファイルが空であるかどうかをチェックしてるの行にある:

は、ここに私のコードです。なぜそれが起こっているのか分かりません。空であっても例外なく実行されます。助言がありますか?

+6

タイトルはあなたの課題ではなく、あなたの問題を記述するべきです。 – csmckelvey

+1

http://stackoverflow.com/questions/2390912/checking-for-an-empty-file-in-c –

+1

'std :: ifstream'は、明示的に指定しない限り、無効な入力に対して例外をスローしません。 –

答えて

2
if(inputStream.ios::eof()) // code never enters this, even if file is empty !??? 
{ 
    throw "EmptyFileException"; 
} 

非常に単純な理由。ファイルストリームには、ファイルの終わりに達したことを知る方法がないため、ファイルの終わりが検出されます。ファイルの終わりを見つける唯一の方法は、終わりに達したために読み込みが失敗するまでファイルから読み込むことです。

ファイルが空の場合、最初の読み取りは失敗し、EOFビットが設定されます。これはpeekで確認できます。Checking for an empty file in C++

オフトピック:これは大変です:inputStream.ios::eof()です。 inputStream.eof()は十分であり、オフチャンスで安全かもしれないstd::ifstreameof()を上書きし、EOFビットのチェックよりも相当なものである。

2

もっと簡単な解決策があります。 >>を使用して数値をintに直接読み込むことができます。 EOFに達すると、falseを返します。このため

void calculateMinMax(ifstream& inputStream, int& minNum, int& maxNum) 
{ 
    int currNum; 

    if(inputStream >> currNum) 
    { 
    maxNum = currNum; 
    minNum = currNum; 
    } 
    else // there is not first number 
    { 
    throw "EmptyFileException"; 
    } 

    while(inputStream >> currNum) 
    { 
    inputStream >> currNum; 

    if(currNum > maxNum) 
     maxNum = currNum; 

    if(currNum < minNum) 
     minNum = currNum; 
    } 

    inputStream.close(); 
} 
関連する問題