【问题标题】:Comparing numbers in strings to numbers in int?将字符串中的数字与 int 中的数字进行比较?
【发布时间】:2015-01-16 22:15:08
【问题描述】:

我正在尝试制作一个程序,该程序将打开一个包含此格式名称列表的 txt 文件(忽略项目符号):

  • 3 马克
  • 4 拉尔夫
  • 1 编
  • 2 凯文

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

  • 1 编
  • 2 凯文
  • 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;
}

【问题讨论】:

  • 你试过投射它们吗?这究竟是哪种语言?
  • 对不起,我应该在帖子中包含它。它是 C++。我只是尝试将变量 j 转换为 char 并且还没有任何运气。
  • 您需要有序集合或称为集合类对象,以便您可以存储排序的名称记录(为此使用 std::sort 对象)。如果您仍然卡住,请尝试使用这些并更新您的代码。只是尽量不要为你写代码,因为你已经表现出自己写东西的努力。
  • 我还没有使用过套装,所以我不太确定我是否跟随。可以举个例子吗?

标签: c++ string numbers int compare


【解决方案1】:

使用调试器会告诉你哪里出错了,但让我强调一下错误:

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;
}

因为&gt;&gt; 工作的标准方式涉及读取到下一个空格(或行尾),如果您想读取包含空格的文本块,使用std::getline 会更容易啜饮当前行的其余部分。

注意:我没有尝试处理文本文件中的格式错误的行,或任何其他可能的错误情况。编写正确的文件解析器超出了这个问题的范围,但是有很多关于正确使用 C++ 的流功能的教程。

现在您有了一个方便的结构文件,您可以使用其他标准 c++ 功能对其进行排序,而不是重新发明轮子并尝试自己做:

int sort_file_entry(file_entry a, file_entry b)
{
    return a.i < b.i;
}

int main()
{
    // set up all your streams, etc.

    std::vector<file_entry> lines = parse_file(in);

    std::sort(lines.begin(), lines.end(), sort_file_entry);

    // now you can write the sorted vector back out to disk.
}

再次,对迭代器和容器如何工作的完整介绍远远超出了此答案的范围,但互联网上不乏介绍性 C++ 指南。祝你好运!

【讨论】:

  • 所以,一个完整的“如何做 c++”的答案在这里并不实际,但让我回顾一下并稍微编辑一下我的帖子,也许可以简化一些事情。
  • 感谢您的周到回复。我最近才了解结构,所以我还没有完全理解。例如,如果我有一个包含每行名字和姓氏的列表(例如 3 Mark Wahlberg),我会继续使用 in 还是使用 getline?
  • 抱歉,直到 5 分钟后我才能编辑我的最后回复。我没有阅读你做的笔记,请忽略最后评论的第二部分。
  • @Ron,我稍微编辑了我的代码,并简化了一些事情。你是对的,如果你想读入带有空格的整块文本,你需要使用std::getline,或者如果你知道你的数据文件的格式是合理的,你可以使用in &gt;&gt; firstname; in &gt;&gt; lastname等。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多