将2个结构数组中的信息输出到一个文件中

Output info from 2 struct arrays into one file

本文关键字:文件 一个 输出 结构 2个 数组 信息      更新时间:2023-10-16

如果这没有意义,我深表歉意。我不知道该用谷歌搜索什么。

假设我有两个阵列

string a_1[16];
string a_2[20];

我需要将这些输出到一个带有函数的文件中,首先是a_1[0]到a_1[n]。然后读入a_2。

也可以再次运行该函数,将更多的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…

OP所称的"Something"通常被称为Sentinel或Canary值。要用作哨兵,必须找到数据流中不存在的模式。这很难,因为几乎任何东西都可以在一个字符串中。如果你使用"XxXxXx"作为你的哨兵,那么你必须非常小心,它永远不会被写入文件。

这里可以使用转义符(Look it up(的概念,但更好的方法是在文件开头存储存储的字符串数。考虑一个看起来像的输出文件

4
string a1_1
string a1_2
string a1_3
string a1_4
2
string a2_1
string a2_2

读取cont,四个,然后读取计数字符串,然后读取下一个计数,然后读取更多计数字符串

好吧,所以你认为他很差劲。我不能只在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循环不那么方便。