Я прошу прощения, если это не имеет смысла. Я не уверен, что гуглить.
Допустим, у меня есть два массива
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 ….
То, что ОП называет «Нечто», обычно называется «Стражем» или «Канарскими». Для использования в качестве дозорного вы должны найти шаблон, который не может существовать в потоке данных. Это сложно, потому что в строке может быть что угодно. Если вы используете, скажем, «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
петля менее удобная.
Других решений пока нет …