Я думаю, что будет проще упростить ваш опубликованный код, чем пытаться найти все места, где вы могли бы иметь ошибки.
Если вы ожидаете увидеть в вашем файле только double
значения, вы можете упростить код для чтения данных из файла в:
while ( data_file >> new_data_pt )
{
// Use new_data_pt
}
Если вы ожидаете, что могут быть значения, отличные от double
s, то вы можете использовать:
while ( getline(data_file, line) )
{
std::istringstream str(line);
while ( str >> new_data_pt )
{
// Use new_data_pt
}
}
, но затем Вы должны понимать, что код больше не будет читать значения из строки после того, как обнаружит ошибку. Если ваша строка содержит
10.2 K 25.4
, код будет читать 10.2
, возникнет ошибка в K
и не будет обрабатываться 25.4
.
Код для обработки new_data_pt
является то, что он должен быть сохранен в динамически распределенном массиве. Я хотел бы предложить поместить это в функцию.
double* add_point(double* data_ptr, int data_len, double new_data_pt)
Вызвать эту функцию как:
data_ptr = add_point(data_ptr, data_len, new_data_pt);
Предполагая, что первое while
l oop, содержимое main
становится :
int main()
{
std::fstream data_file{ "millikan2.dat" };
// It is possible that the file has nothing in it.
// In that case, data_len needs to be zero.
int data_len{ 0 };
// There is no need to allocate memory when there is nothing in the file.
// Allocate memory only when data_len is greater than zero.
double* data_ptr = nullptr;
double new_data_pt;
if (!data_file.good()) {
std::cerr << "Cannot open file";
return 1;
}
while ( data_file >> new_data_pt )
{
++data_len;
data_ptr = add_point(data_ptr, data_len, new_data_pt);
}
// No need of this.
// The file will be closed when the function returns.
// data_file.close();
}
add_point
может быть реализовано как:
double* add_point(double* data_ptr, int data_len, double new_data_pt)
{
double* new_data_ptr = new double[data_len];
// This works even when data_ptr is nullptr.
// When data_ptr is null_ptr, (data_len - 1) is zero. Hence,
// the call to std::copy becomes a noop.
std::copy(data_ptr, data_ptr + (data_len - 1); new_data_ptr);
// Deallocate old memory.
if ( data_ptr != nullptr )
{
delete [] data_ptr;
}
new_data_ptr[data_len-1] = new_data_pt;
return new_data_ptr;
}
Код для отслеживания количества плохих точек намного сложнее. Если вы не обязаны это делать, я бы посоветовал игнорировать это.