我相信我的错误在我的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上编写了程序,现在我正在尝试使用visual studio在我的Windows comp上运行它。我将描述我正在尝试做什么,如果我提前选择的话很糟糕,我会道歉。我把*放在哪里,我不确定发生了什么,但我会对它进行抨击..我的代码的任何解释都非常感谢!!
我的readline()函数执行以下操作:创建一个名为line的字符串,创建一个名为lines的字符串类型的向量,**输入文件classes.txt并将myfile作为对象建立,然后打开myfile进行写入,**使用while循环将txt中的行写入myfile对象,然后关闭myfile,打印出一条语句让用户知道readline()已运行,然后**将名为lines的向量传递给sortline函数,然后将行传递到writeline函数。
** sortline接受一个字符串向量作为其arg,并为其分配对象sortthis ??然后我不确定会发生什么,但看起来我应用了排序算法,有人有什么想法吗?
最后我们得到了我的writeline函数,它接受一个字符串向量作为其arg并为它们分配名称行(这是正确的吗?)然后我想建立一个新的文件流到一个名为“new”的新文本文件.txt“对象名为myfile2,如果myfile2打开,那么我想把字符串向量中的所有行(包含原始文本文件的内容)写入myfile2,将它们写入new.txt文件,然后关闭myfile2,打印一条消息,说明该函数已运行,就是这样。
答案 0 :(得分: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 for 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
,并正确处理没有元素的情况。