Выключен на одну ошибку в цикле while с eof ()

У меня есть ошибка в следующем фрагменте кода C ++, и я не могу понять это. Может кто-нибудь, пожалуйста, помогите. У меня есть код и его вывод ниже. Лучший.

double* alloc_Array=new double[m_int_NumChann*m_int_NumSamples];
int int_SizeArray=int(0);
std::ifstream File;
File.open(m_char_Address);
if(File.is_open()){
std::cout<<"input file opened...\n";
int i=int(0);
do{
File>>alloc_Array[i];
i++;
}while(!File.eof());
int_SizeArray=i;
}else{
std::cerr<<"ERROR: input file can't be opened.\n";
system("pause");
}
File.close();
if((m_int_NumChann*m_int_NumSamples)!=int_SizeArray){
std::cerr<<"WARNING: number of samples multiplied by number of channels is not equal to total data points in the input file:\n";
std::cerr<<"       number of samples in each channel = "<<m_int_NumSamples<<'\n';
std::cerr<<"       number of channels = "<<m_int_NumChann<<'\n';
std::cerr<<"       total data points by multiplication = "<<m_int_NumSamples*m_int_NumChann<<'\n';
std::cerr<<"       number of data points in the input file = "<<int_SizeArray<<'\n';
system("pause");
}

Выход:

   input file opened...

WARNING: number of samples multiplied by number of channels is not equal to tota
l data points in the input file:

number of samples in each channel = 77824

number of channels = 11

total data points by multiplication = 856064

number of data points in the input file = 856065

Press any key to continue . . .

1

Решение

Самый простой способ исправить это — не зацикливаться на eof(),

Есть известные проблемы с попыткой зацикливаться на eof() или же good() правильно, прочитайте эти вопросы для примеров: Почему iostream :: eof внутри условия цикла считается неправильным? а также Тестирование stream.good () или! Stream.eof () дважды читает последнюю строку

Вы можете изменить порядок своего кода, чтобы он только увеличивался i когда значение было успешно прочитано:

int i=int(0);
while (File >> alloc_Array[i]) {
i++;
}
int_SizeArray=i;
3

Другие решения

В вашем цикле do {} while () вы увеличиваете i каждый раз. Рассмотрим случай файла нулевой длины. Произойдет первый проход цикла, после которого я буду равен 1. Поскольку EOF будет достигнут немедленно, более поздний проход не произойдет. Однако в этом случае образцы не были найдены.

Вы захотите уменьшить i один раз после окончания цикла. Помните разницу между подсчетом количества сэмплов, которые вы нашли (на один меньше, чем количество выполнений цикла) и количеством элементов в массиве, который вы пытались заполнить.

2

По вопросам рекламы [email protected]