读取文件,跳转行并将数据存储在数组中。

时间:2013-09-13 05:10:04

标签: c++ arrays file text-parsing

我是C ++的新手,我的程序有问题。我已经看了几个小时和几天,即使有很多类似于这个的帖子,我也无法弄清楚为什么我的程序不起作用。

我有一个以这种方式包含数据的文件。

STRING FLOAT FLOAT

STRING INT

STRING FLOAT FLOAT FLOAT

STRING INT INT

FLOAT

FLOAT ...

所以前几行有第一列的字符串和其余的数字,在某些时候只有浮点数。

我已经设法将数据提供到所有浮点数开始的位置,但我无法弄清楚如何将其余数字存储在数组中。 (我知道用矢量做它会更加容易,但是我必须用阵列来做它。)

这就是我所做的。

void getData(string *ext, int size)
{
   istringstream is(*ext);
   float val;
   is >> val;
   float *arrVal = new float[10];    // I dont know the size of the Array.

   if(typeid(val) == typeid(float))  //IM NOT SURE ABOUT THIS AT ALL. I JUST DON'T KNOW HOW TO GET TO THE LINE WHERE THERE ARE NO STRINGS
   {
      arr[size] = atof(*ext.c_str());
    }                                  // I think this part is why it does not work.

int main()
{
ifstream File("t.txt");         
string line;                                        
int nLines(0);                                  
float *arrayValues =  new float[12];                


if(!inFile)                                         
{
    cerr << "Cannot open file." << endl;
    return -1;
}
else
{       
    while(getline(File, line))
    {
        getValues(&line, nLines);
        getPoints(&line);   //this function gets the values of the first lines.

        ++nLines;

    }
}

system("pause");
return 0;
}

所以基本上我必须弄清楚如何跳转到所有浮动开始的行以及如何将它们存储在数组中。 我确信有一堆错误。我希望你们能得到我想做的事。我真的到处寻找,找不到任何东西。

谢谢!

2 个答案:

答案 0 :(得分:0)

当您阅读每个文件时,您将获得char中的数据。所以, - 使用strtok标记由空格读取的每一行。如果您的字符串之间有空格,则此逻辑不起作用。它的工作正常,如果你的字符串只有一个单词,如“STRRING”或“FLOAT”。如果你的字符串就像“我是天才”:)它不起作用 - 验证每个令牌是否简单,如果条件应该完成您的工作。字符串以[a-z]或[A-Z]开头。数字使用[0-9]。 - 一个valiadated。使用atoi或itoa或其他方式执行所需的转换。

答案 1 :(得分:0)

此骨架将跳过文件中不是浮点数的任何行。

bool isFloat(string s)
{
    bool result = true;
    bool decimalSeen = false;
    for(int i = 0; i < s.length(); ++i)
    {
        if(s[i] == '.')
        {
            if(!decimalSeen)
            {
                decimalSeen = true;
            }
            else
            {
                result = false;
                break;
            }
        }
        else if(s[i] >= '0' && s[i] <= '9')
        {
            continue;
        }
        else
        {
            result = false;
            break;
        }

    }
    return result;
}

int main()
{
    ifstream File("t.txt");         
    string line;

    if(!File.is_open())                                         
    {
        cerr << "Cannot open file." << endl;
        return -1;
    }
    else
    {       
        while(getline(File, line))
        {
            if(isFloat(line))
            {
                float val = atof(line.c_str());
                // Now add to array
            }
        }
    }

    system("pause");
    return 0;
}

如果要使用数组,则必须创建一个更大的数组并复制值。总体思路:

int maxSize = 10;
float* a = new float[maxSize];
// use a until it is full then
float* b = new float[maxSize*2];
memcpy(b, a, sizeof(float)*maxSize);
maxSize *= 2;
float* temp = a;
// make a point to new array
a = b;
// free memory a was using before
delete[] temp;