【问题标题】:Parsing a string of numbers into an integer array将一串数字解析为整数数组
【发布时间】:2012-10-05 02:16:53
【问题描述】:

我有一个文本文件,其数字范围为 0-255,以逗号分隔。我希望能够将这些数字中的每一个存储到一个整数数组中。文本文件可能包含的一个示例是; "32,51,45,12,5,2,7,2,9,233,132,175,143,33..."等

我已经设法让我的程序将文本文件中的数据存储为字符串并将它们输出到屏幕上。接下来我需要做的是将该字符串的值存储在一个整数数组中,用逗号分隔数字。

这是我到目前为止编写的代码,但我无法让它工作;

int _tmain(int argc, _TCHAR* argv[])
{
   string line;
   ifstream myfile ("example.txt");
   if (myfile.is_open())
   {
       while ( myfile.good() )
       {
           getline (myfile,line);
           cout << line << endl;
       }
       myfile.close();
   }

   else cout << "Unable to open file"; 

//STRING CONVERSION
std::string str = line;
std::vector<int> vect;

std::stringstream ss(str);

int i = 0;

while (ss >> i)
{
    vect.push_back(i);

    if (ss.peek() == ',')
        ss.ignore();
}

system("pause");
return 0;

【问题讨论】:

  • 代码的哪一部分导致了问题?换句话说,你的问题是什么?
  • @pedrofurla 我收到错误消息“无法找到或打开 PDB 文件”,即使正在定位和读取该文件。但我的主要问题是我是否正确执行了操作的第二部分(字符串转换)?这是正确的方法吗?
  • 编辑问题,以便它提供正确的信息和实际提出的问题。不要指望人们只看你的并修复它。
  • 对于你的问题,我认为它会像你一样工作(至少是逗号分隔),但我认为如果你读完 int 并且 peek() 没有给出回一个逗号,你可能应该打破你的循环(尽管它可能会在下一次读取时失败)。

标签: c++ arrays string parsing csv


【解决方案1】:

您的字符串标记代码看起来有点不对劲。特别是,您需要确保在整数字符串上调用 atoi() 以获取整数。不过我会专注于字符串的解析。

您可以使用 C 的 strtok。我推荐这个主要是因为你的情况很简单,这可能是最简单的方法。

您要查找的代码基本上是这样的:

char* numStr = strtok(str.c_str(), ",");
while (numStr)
{
    vect.push_back(atoi(numStr));
    numStr = strtok(NULL, ",");
}

strtok() 有两个参数:一个指向要标记的 C 样式字符串 (char*) 的指针,以及分隔符字符串(请注意,分隔符字符串中的每个字符都被视为自己的分隔符)。

我应该提到 strtok 不是线程安全的,您还必须确保从文件中提取的字符串以空字符 \0 结尾。

this question 的答案为我的解决方案提供了许多替代方案。如果您更喜欢使用std::stringstream,那么我建议您查看该页面上的第 5 个答案。

关于您的 PDB 问题,您遇到的确切错误是什么?

【讨论】:

  • 您的字符串终止字符带有错误的斜杠,它应该是 反斜杠 (`\`) 而不是正斜杠。
  • 此外,不鼓励使用atoi,而应使用std::strtolstd::stoi
  • @JoachimPileborg 我犯了一个简单的错字。我不明白这有什么理由拒绝投票。我的回答提供了一个具有相关来源和替代选项的解决方案。您的 cmets 会记录首选呼叫。
猜你喜欢
  • 2019-04-22
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
相关资源
最近更新 更多