Почему моя программа выдает разные результаты в Windows и Linux в отношении чтения файлов с помощью ifstream?

У меня есть программа, показанная ниже. По этому у меня есть несколько вопросов:

1). Почему на разных платформах результаты разные?Скриншоты приложу позже.

2). Я использую метод fail(), чтобы проверить, не завершилась ли ошибка "file.read()". Это правильно?Я использую метод fail(), потому что эта веб-страницаговорит следующее:

Функция возвращает значение true, если установлен либо бит ошибки, либо бит ошибки. По крайней мере, один из этих флагов устанавливается, когда во время операции ввода возникает какая-либо ошибка , отличная от достижения конца файла.

Но позже я прочитал эту страницу об istream::read() здесь.Он говорит, что eofbit и failbit всегда будут установлены в одно и то же время. Означает ли это, что нормальная ситуация с EOF также приведет к тому, что fail() вернет true? Похоже, что это противоречит фразе "кроме достижения конца файла".

Может ли кто-нибудь помочь мне прояснить, как я должен использовать эти методы? Должен ли я вместо этого использовать bad()?

Моя программа

#include 
#include 
using namespace std;

#ifdef WIN32
char * path="C:\\Workspace\\test_file.txt";
#else
char * path="/home/robin/Desktop/temp/test_file.txt";
#endif

int main(int argc, char * argv[])
{
    ifstream file;

    file.open(path);
    if (file.fail())
    {
        cout << "File open failed!" << endl;
        return -1;  // If the file open fails, quit!
    }

    // Calculate the total length of the file so I can allocate a buffer
    file.seekg(0, std::ios::end);
    size_t fileLen = file.tellg();
    cout << "File length: " << fileLen << endl;
    file.seekg(0, std::ios::beg);

    // Now allocate the buffer
    char * fileBuf = new (std::nothrow) char[fileLen+1];
    if (NULL == fileBuf)
        return -1;
    ::memset((void *)fileBuf, 0, fileLen+1);    // Zero the buffer

    // Read the file into the buffer
    file.read(fileBuf, fileLen);
    cout << "eof: " << file.eof() << endl
         << "fail: " << file.fail() << endl
         << "bad: " << file.bad() << endl;
    if (file.fail())
    {
        cout << "File read failed!" << endl;
        delete [] fileBuf;
        return -1;
    }

    // Close the file
    file.close();

    // Release the buffer
    delete [] fileBuf;

    return 0;
}

Содержимое test_file.txt (показано с помощью «vim -b». Это очень простой файл):

test_file.txt content

Результат в Windows (Visual Studio 2008 SP1):

Windows result

Результат в Linux (gcc 4.1.2):

Linux result

5
задан yaobin 22 March 2012 в 07:05
поделиться