Каков статус потока после каждой операции?Вы не должны читать без проверки.И вы не должны читать, не убедившись, что открытое сработало:
ifstream fill( ip_filename.c_str() );
if ( !fill ) {
// error handling, open failed...
}
После этого я бы согласился с предложением читать построчно:
int row = 0;
string line;
while ( getline( fill, line ) && row < size( pb ) ) {
istringstream sLine( line );
int col = 0;
int tmp ;
while ( sLine >> tmp && col < size( pb[ row ] )) {
pb[row][col] = tmp;
++ col;
}
if ( col != size( pb[ row ] ) ) {
// Input error, too few entries
} else if ( sLine >> ws && sLine.get() != EOF ) {
// Input error, garbage at end of line <row>
}
++ row;
}
if ( row != size( pb ) ) {
// Input error, garbage at end of file
}
В качестве альтернативы,Вы можете определить размеры динамически, в зависимости от ввода:
std::vector<std::vector<int> > pb;
ifstream fill( ip_filename.c_str() );
if ( !fill ) {
// error handling, open failed...
}
string line;
while ( getline( fill, line ) ) {
std::vector<int> tmp1;
istringstream sLine( line );
int tmp2;
while ( sLine >> tmp2 ) {
tmp1.back().push_back( tmp2 );
}
if ( sLine >> ws && ! sLine.eof() ) {
// input error: non-numeric data in line
} else if ( ! pb.empty() && tmp1.size() != pb.back().size() ) {
// input error : inconsistent number of columns.
}
}
// Check here if square matrix required.