c++为什么这个循环在将数据读入结构数组时有缺陷

c++ why is this loop flawed to read in data to a struct array?

本文关键字:结构 数组 有缺陷 数据 为什么 循环 c++      更新时间:2023-10-16

我正在读一首歌的标题、艺术家和歌曲的大小。但这只是第一盘的读数,之后它给了我疯狂的错误值。我的代码非常简单明了,所以我想知道是否有人能告诉我该去哪里。

struct Songs
{
    string title;
    string artist;
    int men;
};
// main stuff
Songs song[50];
int size=0;
for (int i = 0; i<size;i++)
{
    do
    {
        getline(fin, song[size].title);
        getline(fin, song[size].artist);
        fin >> song[size].mem;
        size++;
        i++;
    }
    while (song[size].title.length()>0);
}

该代码不应该做任何事情,因为当for循环开始时,isize都为零。或者,更正确地说,不会启动:-)

如果您想从输入流中读取三元组,直到空白标题或数组已满,您可以从以下内容开始:

// Initialise size.
int size = 0;
// Try to get first title.
getline (fin, song[size].title);
// While a title was successfully read.
while (song[size].title.length() > 0) {
    // Get artist and mem (watever that is).
    getline (fin, song[size].artist);
    fin >> song[size].mem;
    Move to next array element, prevent overflow by loop exit.
    if (++size == 50)
        break;
    // Try to get next title.
    getline (fin, song[size].title);
}
// Out here, size is the number of array elements used (0-50).

它可能编译不完美,我还没有测试过。它肯定不会处理边缘情况,比如最后一个只有标题的三元组。这只是为了说明算法。

代码中有许多错误。

1) 您正在将大小设置为0,然后尝试启动一个由于此原因而无法运行的for循环。

2) 如果我理解正确的话,你的for循环中有一个do-while循环,对于你要做的任务来说似乎是不必要的。

3) 当试图填充结构时,可以使用大小变量作为数组索引。通常情况下,您会使用在初始化for循环时设置的迭代器变量,在这种情况下为i。您也不应该与i同时递增大小,因为您可能会导致无休止的循环。

4) 你没有缩进的代码!这并不完全是一个错误,但它会使调试变得更加困难,这可能是你最初陷入困境的部分原因。(编辑:现在看来已经更正了。)

一般来说,如果你正在读取一个文件,一种方法是在文件的开头有一个整数,它指定你正在创建的对象的数量,使你能够为堆分配适当的内存量,同时还可以设置你的大小变量。然后使用这个大小变量实现一个for循环,将数据读取到结构中。

至少while (song[size].title.length()>0)size已经增加之后才关注song[size]。尝试song[size-1]