将标记存储到数组中

时间:2012-02-13 15:16:28

标签: c++ arrays ifstream strtok

C ++的新手,我正在尝试创建一个统计程序来练习编码。我希望得到一个文本文件,读取它并将值存储到我可以执行数学运算的数组中。我被困在这里

 main ()
 {
      char output[100];
      char *charptr;
      int age[100];
      ifstream inFile;
      inFile.open("data.txt");
      if(!inFile)
      {
            cout<<"didn't work";
            cin.get();
            exit (1);
      }

      inFile.getline(output,100);
      charptr = strtok(output," ");
      for (int x=0;x<105;x++)
      {
           age[x] = atoi(charptr);
           cout<<*age<<endl;

      }

     cin.get();
}

在上面的代码中,我试图将主题年龄存储到int数组'age'中,将年龄保存在文件的第一行。我打算像上面提到的那样使用strtok,但我无法将令牌转换为数组。

你可以清楚地看到,我是一个完整的菜鸟请跟我一起,因为我自己学习这个。 :)

谢谢

P.S:我读过类似的帖子,但我无法按照那里给出的详细代码。

1 个答案:

答案 0 :(得分:5)

for循环存在一些问题:

  • 由于age有100个元素而超出界限的可能性,但for循环中的终止条件为x < 105
  • 使用前未检查charptr是否为空
  • strtok()循环
  • 内无法随后调用for
  • 打印age元素不正确

以下是for循环的示例修复:

charptr = strtok(output, " ");
int x = 0;
while (charptr && x < sizeof(age)/sizeof(age[0]))
{
    age[x] = atoi(charptr);
    cout << age[x] << endl;
    charptr = strtok(NULL, " ");
    x++;
}

由于这是C ++,建议:

  • 使用std::vector<int>代替固定大小的数组
  • 使用std::getline()来避免指定用于读取行的固定大小缓冲区
  • 使用std::copy()istream_iterator来解析整数行

例如:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>

int main ()
{
    std::vector<int> ages;
    std::ifstream inFile;
    inFile.open("data.txt");
    if(!inFile)
    {
        std::cout<<"didn't work";
        std::cin.get();
        exit (1);
    }

    std::string line;
    std::getline(inFile, line);

    std::istringstream in(line);

    std::copy(std::istream_iterator<int>(in),
              std::istream_iterator<int>(),
              std::back_inserter(ages));

    return 0;
}