【问题标题】:Dynamically Allocating Array With Datafile使用数据文件动态分配数组
【发布时间】:2015-12-08 06:15:44
【问题描述】:

在 C++ 项目中,我一直在尝试使用数组来存储文本文件中的数据,以便稍后使用。我在初始化没有大小的数组时遇到了问题。这是我一直在做的一个基本示例:

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main()
{
    int i = 0;
    ifstream usern;
    string data;
    string otherdata;
    string *users = nullptr;


    usern.open("users.txt");

    while(usern >> otherdata)
        i++;

    users = new (nothrow) string[i];

    for (int n = 0; usern >> data; n++)
    {
        users[n] = data;
    }


    usern.close();
    return 0;
}

这是我拼凑起来的一个非常粗略的例子。基本上,我尝试从名为users.txt 的文本文件中读取项目并将它们存储在一个数组中。我在包含的示例中使用了指针(考虑到我对指针不太了解,这可能不是最好的主意)。当我运行这个程序时,无论文件中的数据如何,当我尝试通过包含cout &lt;&lt; *(users + 1) 来测试这些值时,我都没有得到任何结果。它只是在窗口中留下一个空白行。我猜我的错误在于我对指针的使用或我如何在指针本身中分配值。我想知道是否有人可以指出我如何将正确的值放入数组的正确方向。谢谢!

【问题讨论】:

  • 你能告诉我们文件的格式吗?例如是.csv.xml.tsv 还是每行一个用户等??
  • 另外我建议使用 std::vector 这样的东西,因为它允许动态大小重新分配而无需您使用指针??
  • 给定的文件是一个 .txt,由 3 个文本字符串组成,但理想情况下,字符串的数量可以更改并且仍然有效。此外,这是一项任务的一小部分,我们不允许在任何地方使用向量。如果是这样,我不会有任何问题,因为向量对我来说更有意义!
  • 我会把它包含在你的问题中(作为编辑),否则几乎每个人都会告诉你使用向量:)

标签: c++ arrays pointers dynamic-allocation


【解决方案1】:

尝试重新打开用户后

    while(usern >> otherdata)
    i++;

也许,尝试放入

usern.close();
ifstream usern2;
usern2.open("users.txt");

在那之后。

可能还有其他问题,但这对我来说似乎是最有可能的问题。让我知道你是否在这方面取得了成功。在我看来,usern 似乎已经到达 eof,然后您尝试再次读取它。

对我发现此类问题有很大帮助的一件事就是放一个 cout

你也可以用 usern.seekg(0, ios::beg); 做同样的事情

【讨论】:

  • 解决了这个问题!从来没有想过要打开它两次。谢谢你的建议!
  • 会推荐使用 seekg 而不是关闭并重新打开??
【解决方案2】:

我认为您的代码中发生的事情是您已经移动了文件中的指针,该指针显示了从哪里读取文件。当您使用下面的代码迭代要读取的字符串数量时,就会发生这种情况。

while(usern >> otherdata)
    i++;

然而,这将文件指针带到了文件的末尾,这意味着为了读取文件,您需要将文件指针移动到文件的开头,然后再将其重新读取到您的字符串数组中分配大小i。这可以通过在 while 循环后添加 usern.seekg(0, ios::beg); 来实现,如下所示。 (有关文件指针的好教程,请参阅here。)

while(usern >> otherdata)
    i++;

// Returns file pointer to beginning of file.
usern.seekg(0, ios::beg);

// The rest of your code.

警告:我不确定动态分配 STL 容器的安全性,我之前遇到过与您的代码类似的问题,建议在功能代码中远离此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 2021-08-17
    • 2017-05-29
    • 2022-01-15
    相关资源
    最近更新 更多