2013-09-13 2 views
0

Я вроде как новый для 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; 
} 

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

спасибо !!

+0

Что делают getPoints (& line) и getValues ​​(& line, nLines)? – khajvah

+0

Вы правы насчет ошибок. Это не компилируется. Пожалуйста, напишите что-нибудь, что делает. И знаете ли вы, что такое * ссылка *? – WhozCraig

+0

О, getPoints должен быть getData выше, я просто изменил его имя. Полученные значения получают первые строки, которые начинаются со строки. – user2775084

ответ

0

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

+0

Когда вы говорите каждый файл, вы имеете в виду каждую строку файла? Итак, вы говорите об основной функции или getData? – user2775084

+0

Да, я имел в виду каждую строку файла, который читается. :) Спасибо за указание на это. теперь будет заботиться. – kris123456

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; 
Смежные вопросы