Таким образом, у меня и моих одногруппников внезапно появляется некоторая работа сцепления под рукой. Мне было поручено создать функцию импорта, которая читает текстовый файл, который выглядит следующим образом, и сохраняет его в двухмерном массиве:
Столбцы разделены табуляцией. Как только это неожиданно возникло, у меня нет всего файла проекта, и я совсем не рядом со своими старыми надежными пользователями, я попытался придумать это самым общим способом:
void signal::import_data(string filename){
ifstream file;
file.open(filename.c_str());
if(file.fail()){
cerr << "file open fail" << endl;
}else{
while(!file.eof)
{
for(int j = 0; j < NumCols; j++){
for(int i = 0; i < NumRows; i++){
file >> _data[j][i];
}
}
}
}
file.close();
}
Я делаю это правильно? Я не уверен, что потоковое вещание может обойти вкладки или нет?
Я думаю, что этот код:
while(!file.eof)
{
for(int j = 0; j < NumCols; j++){
for(int i = 0; i < NumRows; i++){
file >> _data[j][i];
}
}
}
следует заменить на это:
for(int j = 0; j < NumCols; j++)
{
for(int i = 0; i < NumRows; i++)
{
if ( !(file >> _data[j][i]) )
{
std::cerr << "error while reading file";
break;
}
}
if ( !file ) break;
}
Это если вы ожидаете NumCols * NumRows
записи должны быть в файле, зачем явно проверять конец файла? Пусть читает, пока не прочтет NumCols * NumRows
Записи читаются. Как только он прочитает, он автоматически выйдет из цикла.
Но вы должны проверить, заканчивается ли файл до NumCols * NumRows
Записи читаются, поэтому я делаю это:
if ( !(file >> _data[j][i]) )
{
std::cerr << "error while reading file";
break;
}
Если файл достигает ВФ символ, ИЛИ какой-то другой сбой чтения, прежде чем он заканчивает чтение NumCols * NumRows
записи, то условие в if
оценил бы true
и он напечатает сообщение об ошибке и разорвет цикл, он также разорвет внешний цикл, как выражение !file
будет оценивать true
,
Для подробного объяснения относительно того, КАК читать файлы, используя потоки C ++, прочитайте ответы из этих тем:
Других решений пока нет …