gpt4 book ai didi

c++ - 动态更改数组的大小并读取值。 (不带 vector )

转载 作者:行者123 更新时间:2023-12-02 10:06:18 25 4
gpt4 key购买 nike

您好,我遇到以下困难,
我试图读一张 double 表(每行1个条目)并将其存储在数组中,同时动态更改此数组的大小(对于每行/条目)。这是用于学校作业,并且禁止使用 vector (这样会更容易...)。我的主要想法是要有一个存储值的主数组,然后将先前的值和下一个值存储到一个新的数组中,并反复进行此操作。当前,我遇到的问题是仅存储表的最后一个值。我知道,以某种方式我需要通过引用将数据传递给全局函数,并且我正在使用的指针会在随后的while迭代退出时变为null。但是,由于数据的确切长度是未知的,因此这似乎是不可能的,因为在main()中初始化数组是不可能的(确切长度未知)。任何帮助,将不胜感激。
代码如下。

编辑:在考虑了两个注释后,我对代码进行了以下更改,但是我不确定它们是否会正常运行。我添加了一个名为add_new_datapoint的新函数,该函数应全局更改指针/长度的值,这是通过引用传递值来完成的。在有问题的else语句中调用为add_new_datapoint(data_ptr,data_len,new_dp)。另外,我不确定将新的内存重新分配给指针变量不会导致内存泄漏。本质上(在我重新分配data_ptr之后,是“被指向”的内存已释放,还是必须删除它,然后在中重新初始化它。在这种情况下,我可以在下一个中再次引用指针“data_ptr”循环的迭代?

最佳答案

我认为简化发布的代码比尝试查找所有可能出错的地方要容易。

如果希望在文件中仅看到double值,则可以将用于从文件读取数据的代码简化为:

while ( data_file >> new_data_pt )
{
// Use new_data_pt
}

如果您期望 double之外的其他值,则可以使用:
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循环, 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;
}

跟踪不良点数量的代码要复杂得多。除非您被要求这样做,否则我建议您忽略它。

关于c++ - 动态更改数组的大小并读取值。 (不带 vector ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60051616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com