У меня есть программа, показанная ниже. По этому у меня есть несколько вопросов:
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;
}