将字符串中的数字与int中的数字进行比较?

时间:2014-11-19 11:48:11

标签: c++ string numbers int compare

我试图制作一个程序,打开一个包含这种格式名称列表的txt文件(忽略项目符号):

  • 3马克
  • 4拉尔夫
  • 1 Ed
  • 2 Kevin

并将根据前面的数字创建一个带有组织名称的文件:

  • 1 Ed
  • 2 Kevin
  • 3马克
  • 4拉尔夫

我认为我在第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;
&#13;
&#13;

1 个答案:

答案 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 ++指南。祝你好运!