如果这没有意义,我道歉。我不确定要谷歌。
假设我有两个阵列
string a_1[16];
string a_2[20];
我需要将这些输出到带有函数的文件,首先是a_1 [0]到a_1 [n]。 然后读入a_2&#39。
还可以再次运行该功能,将更多a_1和a_2添加到输出文件中。
所以格式为:
//output_file.txt
a_1[0].....a_1[n]
a_2[0].....a_2[M]
a_1[n+1]...a_1[16]
a_2[M+1]...a_2[20]
我的问题是。有没有办法读回output_file.txt,以便它将读取所有a_1中的顺序,a_1 [0]到a_1 [16]。 然后输入a_2 [0]到a_2 [20]。
也许只是把"某事"在每个组之间,以便当"某事物"如果阅读,它知道停止阅读a_1并切换到读入a_2 ....
答案 0 :(得分:1)
OP打电话给什么" Something"通常称为Sentinel或Canary值。要用作标记,您必须找到数据流中不存在的模式。这很难,因为几乎所有东西都可以在一个字符串中。如果您使用,例如," XxXxXx"作为你的哨兵,你必须非常小心,它永远不会被写入文件。
这里可以使用转义字符(查找)的概念,但更好的方法是在文件的开头存储存储字符串的计数。考虑一个看起来像
的输出文件4
string a1_1
string a1_2
string a1_3
string a1_4
2
string a2_1
string a2_2
读取cont,four,然后读取计数字符串,然后读取下一个计数,然后读取计数更多字符串
好的,所以你认为他很糟糕。我不能只是在a1中插入一个新字符串而不改变文件前面的数字。好吧,祝你好运,将数据插入到文件中间而不会完全模糊文件。它可以完成,但只有在插入后按插入的大小移动所有内容之后才能完成,并且这不像听起来那么微不足道。在编程职业生涯中,这是您被分配的任务,并且您必须寻求帮助,您几乎注定要将文件读入内存,插入新值并将文件写回再来一次,所以就这样吧。
那么代码中的内容是什么样的?首先,我们抛弃数组,转而使用std::vector
。矢量很聪明。他们变得健康。他们知道里面有多少东西。他们照顾自己,因此没有不必要的new
和delete
胡说八道。你不要使用它们是愚蠢的。
读:
std::ifstream infile(file name);
std::vector<std::string> input;
int count;
if (infile >> count)
{
infile.ignore(); // discard end of line
std::string line;
while (input.size() < count && getline(infile, line))
{
input.push_back(line);
}
if (input.size() != count)
{
//handle bad file
}
}
else
{
// handle bad file
}
并撰写
std::ofstream outfile(file name);
if(outfile << output.size())
{
for (std::string & out: output)
{
if (!outfile << out << '\n')
{
// handle write error
}
}
}
else
{
// handle write error
}
但这看起来像是家庭作业,所以OP可能不允许使用它。在这种情况下,逻辑是相同的,但你必须
std::unique_ptr<std::string[]> inarray(new std::string[count]);
或
std::string * inarray = new std::string[count];
为您正在阅读的字符串分配存储空间。第二个工作看起来比第一个工作少。看起来很欺骗。第一个为你照顾你的记忆。第二个代码要求代码中的至少一个delete[]
以正确的速度放置内存。想念它并且你有内存泄漏。
你还需要有一个变量来跟踪数组的大小,因为指针不知道它们所指向的大小。这使得写for
循环不太方便。