2011-02-02 6 views
3

Я пытаюсь читать из двоичного файла в UNIX. Файл существует и содержит в нем несколько данных.fstream unix problem in reading

код выглядит следующим образом:

fstrean fstrHandler; 

string strFileName; 

char Buf[30000]; 

fstrHandler.open(strFileName.c_str(), ios::in | ios::binary); 

fstrHandler.seekp(0, std::ios_base::beg); 

std::cout<< "Posi before read= "<< fstrHandler.tellg()<<endl; //*** Show after running 0 

fstrHandler.read (Buf, 400); 

std::cout<< "Posi after read= "<< fstrHandler.tellg()<<endl; //*** Show after running 0 

std::cout<< " gcount()= "<< fstrHandler.gcount()<< << endl; //*** Show after running 0 

if (fstrHandler.eof()) { 
     fstrHandler.clear(); 
} 

После чтения я получаю, что позиция в файле по-прежнему ноль ноль, но файл не пуст.

+0

s/fstrean/fstream /. Кроме того, вы должны проверить, действительно ли 'fstream :: open' действительно удалось, например:' assert (fstrHandler.good()) '. – jweyrich

+0

Я не добавил его, но он существует –

+0

И после нижеследующих комментариев assert (fstrHandler) вместо good(). –

ответ

2

Просьба seekg, а не seekp, есть 400 байтов в файле? это, похоже, работает нормально для меня, если вы введете файл, содержащий более 400 байт. Если меньше, то tellg после чтения отчетов -1, но gcount() верен.

Кроме того, после открытия файла - тест, чтобы проверить, действительно ли файл открыт, например.

if (fstrHandler) 
{ 
// do stuff 
} 
else 
    std::cerr << "foo bar" << std::endl; 
+0

G для получения (прочитано), P для ввода (записи). –

+0

Это условие всегда будет оценивать true. Для этого существует 'operator! ', Или' good() ', или' fail() ', или' is_open() '. – jweyrich

+1

@jweyrich: if (stream) не всегда истинно [после открытия] (http://codepad.org/ARjqICEB), и это противоположность op !, который сам по себе такой же, как fail(). Не используйте good(). –