C ++从文件中获取数据以记住上次会话

时间:2016-02-10 20:27:39

标签: c++ file struct

我要做的是将项目,时间戳和已完成状态保存到文件中,然后在重新启动程序时,数据将从文件恢复到列表中。现在,我可以将信息保存到文件“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();

1 个答案:

答案 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()和你进入菜单循环之前。

现在,在此期间,您已删除了大部分代码。但我认为在内存分配方面也可能存在潜在的问题(我认为它是一些功课,而你还不允许使用标准库容器,如矢量)。检查您是否已将一些内存用于将数据读入列表,然后再填充数组