0

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

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

字符串浮点数

字符串整数

字符串浮点数浮点数

字符串整数

漂浮

漂浮 ...

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

我已经设法将数据增加到所有浮点数的开始位置,但我不知道如何将其余数字存储在数组中。(我知道用向量来做会容易得多,但我必须用数组来做)。

这就是我所做的。

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

所以基本上我必须弄清楚如何跳转到所有浮点数开始的行以及如何将它们存储在数组中。我确信有一堆错误。我希望你们能得到我想要做的。我真的到处找遍了,什么也找不到。

谢谢 !!

4

2 回答 2

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;
于 2013-09-13T06:17:44.600 回答
0

当你阅读每个文件时,你会得到一个 char 格式的数据。所以, - 使用 strtok 标记由空格读取的每一行。如果您的字符串之间有空格,则此逻辑不起作用。如果您的字符串只有一个单词,例如“STRRING”或“FLOAT”,它就可以正常工作。如果您的字符串类似于“我是天才”,则它不起作用:) - 验证每个标记一个简单的 if 条件应该可以完成您的工作。字符串以 [az] 或 [AZ] 开头。数字使用 [0-9]。-一旦验证。使用 atoi 或 itoa 或其他方式执行所需的转换。

于 2013-09-13T05:39:47.130 回答