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