Вывод информации из 2 массивов структур в один файл

Я прошу прощения, если это не имеет смысла. Я не уверен, что гуглить.

Допустим, у меня есть два массива

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

0

Решение

То, что ОП называет «Нечто», обычно называется «Стражем» или «Канарскими». Для использования в качестве дозорного вы должны найти шаблон, который не может существовать в потоке данных. Это сложно, потому что в строке может быть что угодно. Если вы используете, скажем, «XxXxXx» в качестве вашего дозорного, то вы должны быть очень осторожны, чтобы он никогда не записывался в файл.

Здесь можно использовать концепцию Escape-символов (посмотрите), но лучшим подходом может быть сохранение количества сохраненных строк в начале файла. Рассмотрим выходной файл, который выглядит как

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

Прочитайте продолжение, четыре, а затем прочитайте строки счета, затем прочитайте для следующего счета и затем прочитайте число строк

ОК, значит, ты думаешь, что он отстой. Я не могу просто вставить новую строку в 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 петля менее удобная.

1

Другие решения

Других решений пока нет …