我要做的是将项目,时间戳和已完成状态保存到文件中,然后在重新启动程序时,数据将从文件恢复到列表中。现在,我可以将信息保存到文件“data.txt”,但它不会读取它,这就是我最终要完成的事情。
// Get previous session data
fin.open("c:/temp/data.txt", ios::in);
if (fin.fail())
{
cout << "Failed to open file for reading" << endl;
return 0;
}
for(int i = 0; i < numItems; i++)
{
fin >> list[i].completed;
fin >> list[i].timestamp;
getline(fin, list[i].items);
}
fin.close();
答案 0 :(得分:2)
您的代码中存在很多问题。但是,让我们从头开始吧。
main()
启动时,numItem
初始化为0.
以后添加项目时,打开文件。此时,numItem
为sitll 0.然后通过执行以下操作读取文件:
for(int i = 0; i < numItems; i++) //<=== ouch !!! numItem is still 0
...
所以你在一个0的计数器上循环。所以没有从文件中读取任何东西。
如果添加了一些项目,则该列表仅包含手动添加的项目。或者列表仍然是空的。
之后你做的事情是,你使用一个空的或几乎是空的列表。
退出时,用空列表覆盖文件,因此报废!
一种可能的解决方案是在文件的开头写下项目数。在阅读文件时,您要做的第一件事就是将其读入numItem
。然后你可以使用你拥有的那种外观构造。
另一种方法是使用while循环读取文件,并在读取文件时递增numItem。由您决定最合适的解决方案。
每次用户想要添加一些元素时,您都在阅读该文件。这是一个问题,因为每次都会重读文件,可能会覆盖数据......
根据你的解释,你应该只读一个持久数据:在main()和你进入菜单循环之前。
现在,在此期间,您已删除了大部分代码。但我认为在内存分配方面也可能存在潜在的问题(我认为它是一些功课,而你还不允许使用标准库容器,如矢量)。检查您是否已将一些内存用于将数据读入列表,然后再填充数组。