从2个struct数组输出信息到一个文件

时间:2016-03-09 03:59:44

标签: c++ fstream ifstream ofstream data-files

如果这没有意义,我道歉。我不确定要谷歌。

假设我有两个阵列

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 ....

1 个答案:

答案 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。矢量很聪明。他们变得健康。他们知道里面有多少东西。他们照顾自己,因此没有不必要的newdelete胡说八道。你不要使用它们是愚蠢的。

读:

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循环不太方便。