c++为什么这个循环在将数据读入结构数组时有缺陷
c++ why is this loop flawed to read in data to a struct array?
我正在读一首歌的标题、艺术家和歌曲的大小。但这只是第一盘的读数,之后它给了我疯狂的错误值。我的代码非常简单明了,所以我想知道是否有人能告诉我该去哪里。
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
循环开始时,i
和size
都为零。或者,更正确地说,不会启动:-)
如果您想从输入流中读取三元组,直到空白标题或数组已满,您可以从以下内容开始:
// 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]
。
相关文章:
- C++将文本文件中的数据读取到结构数组中
- JSON转换为nlohmann JSON-lib中的结构数组
- 需要帮助将结构数组传递给函数
- 在 64 位边界上对齐C++结构数组?
- 带有枚举方向/类型的气泡排序结构数组
- 在C++中访问结构数组中的数据
- 从指向结构数组的指针中提取元素
- 如何制作一个地图,其中的值是C++中的结构数组
- 如何在函数中显示结构数组
- 包含作为成员C++函数的结构数组
- 如何修复函数中的 fstream 文件输入以将正确的信息存储在结构数组中?
- std::transform 将一个结构数组复制到另一个结构数组
- 将非托管结构数组封送到托管数组
- 显示结构数组
- 结构数组中所有类似字段的总和
- 结构数组的构造函数错误,错误消息:没有构造函数实例与参数列表匹配
- 在 glsl opengl 中将嵌套结构数组作为统一传递
- 使用初始化列表填充C++中的多维结构数组时出现问题
- 如何将字符串字符与结构数组进行比较?
- C++结构数组