从没有分隔符c ++的文件中读取出现的数字

时间:2017-11-08 19:16:26

标签: c++ file c++11 integer delimiter

我有一个正在运行的原型,从文件中读取代码。我的问题是弄清楚如何从文件中读取它没有任何空格。为了使我的代码能够正常工作,文件的内容需要如下所示: 3 4 6 2 5

我想要放入文件的是: 34625

对于我的输出我希望如此:

3次发生4次 4次发生5次 5次发生6次 6次发生7次

我也想知道是否有办法在不初始化数组的情况下打印数字。在我的代码中,我有12个作为文件中的数字。但有没有办法让"未知"以防万一以后用户想要添加更多的整数来从文件中读取?

#include <iostream>     
#include <fstream>
using namespace std;

//NEEDS to read numbers WITHOUT SPACES!!
int main()
{
  ifstream theFile ("inputData.txt");
  int MaxRange= 9;
  char c;
  int myint[12]={0};
  int mycompare[12]={0};
  int mycount[12] = {0};
  int i = 0, j = 0, k = 0;
  for(j=0;j <= MaxRange;j++){
    mycompare[j] = j;
  }

  do
  {
    theFile>>myint[i];
    for(j=0;j<=MaxRange;j++)
    {
      if(myint[i] == mycompare[j])
        mycount[j] = mycount[j]+1;
    }
    i++;
  }
  while((myint[i] >=0) && (myint[i] <= MaxRange));

  for(j=0; j <=MaxRange; j++)
  {
    if(isdigit(j)) 
      ++j;
    cout<< j<< " occurs: "<<mycount[j]<<endl;  
  }
}

3 个答案:

答案 0 :(得分:2)

开头的简单示例(用文件更改cin

#include <iostream>
#include <map>
using namespace std;

int main() {
    map<int, int> m;
    char c;
    while (cin >> c)
        m[c - '0']++;
    for (auto i : m)
        cout << i.first << " occurs " << i.second << " times" << endl;
    return 0;
}

输入

34625

输出

2 occurs 1 times
3 occurs 1 times
4 occurs 1 times
5 occurs 1 times
6 occurs 1 times

答案 1 :(得分:1)

为什么不使用char类型从文件中读取?使用char,您可以逐个字符地阅读并计算它们。最好使用switch-case结构代替&#34;对于&#34;数数。 最后一段对我来说并不清楚。

答案 2 :(得分:1)

免责声明 - 以下代码未经过编译或测试。你按原样转动它,你得到你得到的。

注意我如何更改文件read(cin)以使用char而不是整数。这允许我一次读取文件1个字符。另请注意,我已将范围更改为10,因为有10个可能的数字(记住0),并将我的count数组设置为此大小。另请注意,这将适用于任何文件大小,但如果32位系统上的文件中有超过2亿个整数值(整数溢出),则可能会失败。

#include <iostream>     
#include <fstream>
using namespace std;

int main()
{
  ifstream theFile ("inputData.txt");
  const int MaxRange= 10;
  char c;
  int mycount[MaxRange] = {0};

  // Check for eof each loop.  This may not be the best way to do this, 
  // but it demonstrates the concept.

  // A much better way is to put the cin assign right in the while loop parenthesis- 
  // this replaces and catches the eof automatically.
  while(!cin.eof())
  {
    theFile>>c;

    // If the char isn't a digit, we ignore it.
    if(!isdigit(c))
      continue;

    // Convert char to integer.
    int value = c + '0';

    // Update count array.
    mycount[value]++;
  }

  // Print the final array for each value.  You could skip counts
  // of zero if you would like with a little extra logic.
  for(int j=0; j<MaxRange; j++)
  {
    cout<< j<< " occurs: "<<mycount[j]<<endl;  
  }
}