我试图制作一个程序,打开一个包含这种格式名称列表的txt文件(忽略项目符号):
并将根据前面的数字创建一个带有组织名称的文件:
我认为我在第40行遇到了麻烦,我尝试将存储在字符串中的数字与存储在int中的数字进行比较。
我无法想到任何其他解决方法,任何建议都会很精彩!
#include <iostream>
#include <fstream>
#include <vector>
#include <cstdlib>
using namespace std;
int main()
{
ifstream in;
ofstream out;
string line;
string collection[5];
vector <string> lines;
vector <string> newLines;
in.open("infile.txt");
if (in.fail())
{
cout << "Input file opening failed. \n";
exit(1);
}
out.open("outfile.txt");
if (out.fail())
{
cout << "Output file opening failed. \n";
exit(1);
}
while (!in.eof())
{
getline(in, line);
lines.push_back(line);
}
for (int i = 0; i < lines.size(); i++)
{
collection[i] = lines[i];
}
for (int j = 0; j < lines.size(); j++)
{
for (int x = 0; x < lines.size(); x--)
{
if (collection[x][0] == j)
newLines.push_back(collection[x]);
}
}
for (int k = 0; k < newLines.size(); k++)
{
out << newLines[k] << endl;
}
in.close( );
out.close( );
return 0;
}
&#13;
答案 0 :(得分:0)
使用调试器会告诉你哪里出错了,但让我强调一下错误:
if (collection[x][0] == j)
您期待像3 Mark
这样的字符串。此字符串的第一个字符是'3'
,但其ASCII值为51
,这是您尝试使用它时获得的数值就是这样!这永远不会等于j
,除非您的文件中有很多行,然后您的搜索系统根本无法工作。你需要将该字符转换为整数,然后进行比较。
C ++提供了许多通过流处理数据的方法,包括解析简单的数据文件和将文本转换为数字,反之亦然。这是一个简单的独立函数,它将读取您拥有的数据文件(只有任意文本,包括每行数字后面的空格)。
#include <algorithm>
// snip
struct file_entry { int i; std::string text; };
std::vector<file_entry> parse_file(std::istream& in)
{
std::vector<file_entry> data;
while (!in.eof())
{
file_entry e;
in >> e.i; // read the first number on the line
e.ignore(); // skip the space between the number and the text
std::getline(in, e.text); // read the whole of the rest of the line
data.push_back(e);
}
return data;
}
因为>>
工作的标准方式涉及读到下一个空格(或行尾),如果你想读取一个包含空格的文本块,那么使用{{1}会更容易只是勉强了解当前行的其余部分。
注意:我没有尝试处理文本文件中的格式错误的行,或任何其他可能的错误条件。编写正确的文件解析器超出了本问题的范围,但是有很多关于正确使用C ++的流功能的教程。
现在您拥有一个方便的结构文件,您可以使用其他标准的c ++功能对其进行排序,而不是重新发明轮子并尝试自己完成:
std::getline
同样,对迭代器和容器如何工作的完整介绍完全超出了本答案的范围,但是互联网上并不缺乏介绍性的C ++指南。祝你好运!