使用数据文件动态分配数组
Dynamically Allocating Array With Datafile
在一个 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
的文本文件中读取项目并将它们存储在一个数组中。我在包含的示例中使用了指针(考虑到我对 poniters 了解不多,这可能不是最好的主意)。当我 运行 这个程序时,无论文件中的数据如何,当我尝试通过包含 cout << *(users + 1)
来测试值时,我都没有得到任何结果。它只是在 window 中留下一个空行。我猜我的错误在于我使用指针或我如何在指针本身中分配值。我想知道是否有人可以 指出 我在正确的方向上如何将正确的值放入数组中。谢谢!
在
之后尝试重新打开用户
while(usern >> otherdata)
i++;
也许,尝试输入
usern.close();
ifstream usern2;
usern2.open("users.txt");
紧随其后。
可能还有其他问题,但对我来说这似乎是最有可能的问题。如果您在这方面取得成功,请告诉我。在我看来,usern 似乎已经到达 eof,然后您尝试第二次读取它。
对我发现此类问题有很大帮助的一件事是只输入 cout << "looping";或 for 循环中的某些内容,以便您知道您至少进入了该 for 循环。
你也可以用 usern.seekg(0, ios::beg);
做同样的事情
我认为您的代码中发生的事情是您移动了文件中的指针,该指针显示了从何处读取文件。当您使用下面的代码迭代要读取的字符串数时,就会发生这种情况。
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 容器的安全性,我之前 运行 遇到过与您的代码类似的问题,建议远离这在功能代码中。
在一个 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
的文本文件中读取项目并将它们存储在一个数组中。我在包含的示例中使用了指针(考虑到我对 poniters 了解不多,这可能不是最好的主意)。当我 运行 这个程序时,无论文件中的数据如何,当我尝试通过包含 cout << *(users + 1)
来测试值时,我都没有得到任何结果。它只是在 window 中留下一个空行。我猜我的错误在于我使用指针或我如何在指针本身中分配值。我想知道是否有人可以 指出 我在正确的方向上如何将正确的值放入数组中。谢谢!
在
之后尝试重新打开用户 while(usern >> otherdata)
i++;
也许,尝试输入
usern.close();
ifstream usern2;
usern2.open("users.txt");
紧随其后。
可能还有其他问题,但对我来说这似乎是最有可能的问题。如果您在这方面取得成功,请告诉我。在我看来,usern 似乎已经到达 eof,然后您尝试第二次读取它。
对我发现此类问题有很大帮助的一件事是只输入 cout << "looping";或 for 循环中的某些内容,以便您知道您至少进入了该 for 循环。
你也可以用 usern.seekg(0, ios::beg);
做同样的事情我认为您的代码中发生的事情是您移动了文件中的指针,该指针显示了从何处读取文件。当您使用下面的代码迭代要读取的字符串数时,就会发生这种情况。
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 容器的安全性,我之前 运行 遇到过与您的代码类似的问题,建议远离这在功能代码中。