Нижний индекс вектора ошибок вне диапазона

Я считаю, что моя ошибка в моей writeline функция, когда я пытаюсь записать содержимое вектора в новый файл, используя while петля.

//Read from txt file, write to new text file

#include<iostream>
#include<fstream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;

void readline();
void sortline(vector<string>& sortthis);
void writeline(vector<string>& list);

int main()
{
readline();
system("pause");
return 0;
};

void readline()
{
string line;
vector<string> lines;
ifstream myfile("classes.txt");
if (myfile.is_open())
{
while (myfile.good())
{
getline(myfile, line);
lines.push_back(line);
};
myfile.close();
}
cout << "readline() has run" << endl;
sortline(lines);
writeline(lines);
};

void  sortline(vector<string>& sortthis)
{
sort(sortthis.begin(), sortthis.end());
};

void  writeline(vector<string>& list)
{
ofstream myfile2("new.txt");
if (myfile2.is_open())
{
int i = 0;
while(i !=list.size()-1)
{
myfile2 << list[i] << endl;
i++;
};
myfile2.close();
};
cout << "writeline() has run" << endl;
};

это проект семестра назад, который я возвращаюсь. Я написал программу на своем Mac, сейчас я пытаюсь запустить ее на моем Windows Comp с Visual Studio. Я опишу, что я пытаюсь сделать, извиняюсь, если мой выбор слов ужасен заранее. где бы я ни ставил *, я не уверен, что происходит, но я постараюсь это сделать. Любое объяснение моего кода очень ценится !!

Моя функция readline () выполняет следующие действия: создает строку с именем line, создает вектор строкового типа с именем lines, ** вводит файл classes.txt и устанавливает myfile как его объект, затем открывает myfile для записи, ** использует while цикл, чтобы записать строки из txt в объект myfile, затем закрыть myfile, распечатать инструкцию, чтобы сообщить пользователю, что readline () запустилась, затем ** передать вектор с именем lines в функцию sortline, а затем передать строки в функция писателя.

** sortline принимает в качестве аргумента вектор строк и присваивает ему объект сортировки. тогда я не уверен, что происходит, но похоже, что я применил алгоритм сортировки, у кого-нибудь есть мысли?

и, наконец, мы переходим к моей функции writeline, которая принимает вектор строк в качестве аргумента и присваивает им строки имени (это правильно?). Затем я хочу установить новый поток файлового файла в новый текстовый файл с именем «new.txt». с именем объекта myfile2, если myfile2 открыт, то я хочу записать все строки из вектора строк (которые содержат содержимое исходного текстового файла) в myfile2, который запишет их в файл new.txt, затем закройте myfile2, напечатайте сообщение о том, что функция запущена, и это все.

0

Решение

То, как вы проходите через list в writeline не безопасно Вы должны использовать for петля или while цикл с iterator, В действительности ваш код, вероятно, не выполняет то, что вы намеревались сделать, даже если в нем есть несколько элементов. list, Учтите следующее:

std::vector<std::string> vLines;
vLines.push_back("Hello");
vLines.push_back("File");
vLines.push_back("World");
std::ofstream of("file.txt");
int i = 0;
while (i != vLines.size() - 1)
{
of << vLines[i] << std::endl;
++i;
}

Даже с несколькими элементами в vLines, это будет фактически печатать только вывод 2 элементов в of,
i будет 0 который не 2, так "Hello" будет выводиться на of,
i будет 1 который не 2, так "File" будет выводиться на of,
i сейчас 2, который равен 2, так "World" не будет выводиться на of,

Это с элементы. Если есть 0 элементы в vLines, вы будете индексировать за пределами (я подозреваю, что вы делаете, следовательно, ваша ошибка):

std::vector<std::string> vLines;
std::ofstream of("file.txt");
int i = 0;
while (i != vLines.size() - 1)
{
of << vLines[i] << std::endl;
++i;
}

i будет 0, который не равен -1, поэтому код будет работать и попытаться вывести vLines[0] в of, но нет vLines[0]! Я подозреваю, что это то, что вы испытываете.

Это исчезнет, ​​если вы вместо этого будете использовать правильный цикл на основе диапазона (кредит @WhozCraig для решения C ++ 11):

for (auto const& s : vLines)
of << s;

Или, если у вас нет C ++ 11, вы все равно можете имитировать правильный цикл на основе диапазона следующим образом:

for (int i = 0; i < vLines.size(); ++i)
of << vLines[i] << std::endl;

Или же iterator:

for (auto it = vLines.begin(); it != vLines.end(); ++it)
of << *it << std::endl;

Теперь вы будете выводить все элементы в вашем std::vector на ваш std::ofstream а также правильно обрабатывать ситуации, когда нет элементов.

0

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


По вопросам рекламы [email protected]