Чтение файла, переход по строкам и сохранение данных в массиве.

Я новичок в C++, и у меня проблема с моей программой. Я искал часы и дни, и хотя есть много сообщений, подобных этому, я не могу понять, почему моя программа не работает.

У меня есть файл, содержащий данные таким образом.

СТРУНА ПОПЛАВОК ПОПЛАВОК

STRING INT

СТРУНА ПОПЛАВОК ПОПЛАВОК ПОПЛАВОК

STRING INT INT

ПЛАВАТЬ

ПЛАВАТЬ ...

Таким образом, в первых нескольких строках есть строка для первого столбца и число для остальных, а в какой-то момент есть просто число с плавающей запятой.

Мне удалось получить данные до того места, где начинаются все числа с плавающей запятой, но я не могу понять, как сохранить остальную часть числа в массиве. (Я ЗНАЮ, ЧТО БЫЛО бы НАМНОГО ПРОЩЕ СДЕЛАТЬ ЭТО С ВЕКТОРОМ, НО Я ДОЛЖЕН СДЕЛАТЬ ЭТО С МАССИВАМИ).

Это то, что я сделал.

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

Итак, в основном мне нужно выяснить, как перейти к строке, где начинаются все числа с плавающей запятой, и как сохранить их в массиве. Я уверен, что есть куча ошибок. Надеюсь, вы поняли, что я пытаюсь сделать. Я действительно искал везде и ничего не могу найти.

Спасибо !!


person user2775084    schedule 13.09.2013    source источник
comment
Что делают getPoints(&line) и getValues(&line, nLines)?   -  person khajvah    schedule 13.09.2013
comment
Вы правы насчет ошибок. Это не компилируется. Пожалуйста, опубликуйте что-нибудь, что делает. А вы знаете, что такое ссылка?   -  person WhozCraig    schedule 13.09.2013
comment
О, getPoints должен быть getData выше, я просто изменил его имя. getvalues ​​получает первые строки, те, которые начинаются со строки.   -  person user2775084    schedule 13.09.2013
comment
У вас есть несколько проблем, связанных вместе: 1) анализ файла и поиск места, где начинаются числа с плавающей запятой, 2) их чтение и 3) сохранение их в массиве. Лучше решать — и просить о помощи — по одной проблеме за раз.   -  person Beta    schedule 13.09.2013
comment
Да, это именно то, что мне нужно сделать. Итак, для анализа файла я использую getLine, верно? Я просто не знаю, как прыгать по строкам... Я везде смотрел и не могу понять.   -  person user2775084    schedule 13.09.2013
comment
Вы уже прыгаете по строчкам, когда читаете их с помощью getline(). Каждая строка должна быть проверена на начало с действительного float. Если его нет, то переходите к следующей строке. Если есть, сохраните это значение как первое и введите другой цикл, который передает оставшиеся числа с плавающей запятой и накапливает их (вместе с первым) в массив, размер которого изменяется по мере необходимости.   -  person WhozCraig    schedule 13.09.2013


Ответы (2)


Когда вы читаете каждый файл, вы получаете данные в char. Итак, - Маркируйте каждую строку, прочитанную пробелами, используя strtok. Эта логика не работает, если между строками есть пробелы. Он отлично работает, если ваша строка состоит только из одного слова, такого как «STRRING» или «FLOAT». Это не работает, если ваша строка похожа на «Я гений» :) - Проверяйте каждый токен простым условием if, которое должно выполнять вашу работу. строки начинаются с [a-z] или [A-Z]. Числа используют [0-9]. -После проверки. выполнить необходимые преобразования с помощью atoi или itoa или других.

person kris123456    schedule 13.09.2013
comment
Когда вы говорите каждый файл, вы имеете в виду каждую строку файла? Так вы говорите о основной функции или о getData? - person user2775084; 13.09.2013
comment
Да, я имел в виду каждую строку файла, который читается. :) Спасибо, что указали на это. буду заботиться с этого момента. - person kris123456; 17.09.2013

Этот скелет пропустит любую строку в файле, которая не является числом с плавающей запятой.

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;
person AnotherDeveloperNamedGreg    schedule 13.09.2013