2015-03-08 4 views
0

У меня есть .txt-файл, содержащий несколько тысяч строк значений float, с которыми я должен работать. Я не знаю априорно, сколько значений имеет каждая конкретная строка. Я хочу сохранить все значения в одной строке в один массив.Прочитайте значения в определенной строке (переменное количество значений) и сохраните их в массиве

Это все, что я получил до сих пор:

string line; 
int row = 0; 
ifstream file_input (input.c_str()); 
while (getline(file_input, line)) 
{ 
    row++; 
    if (row == 8) // if I want to read the 8th line 
    { 
     cout << line; 
    } 
} 

Этот код печати все содержание 8-й линии, которая представляет собой большое количество ценностей в целом. Я хочу сохранить все эти значения в массив. Как я могу это сделать?

ответ

2

Вы можете использовать std::stringstream (или std::istringstream) читать эти float с от линии и подтолкнуть их в std::vector.

std::vector<float> vec; 
std::string line; 
std::ifstream file_input (input); 
int row = 0; 
while (getline(file_input, line)) 
{ 
    ++row; 

    if (row == 8) // if I want to read the 8th line 
    { 
     cout << line; 

     std::istringstream iss(line); 
     float value; // auxiliary variable to which you extract float from stringstream 

     while(iss >> value)  // yields true if extraction succeeded 
      vec.push_back(value); // and pushes value into the vector 

     break; 
    } 
} 

Или см. this post для некоторых более профессиональных способов.

0

Поскольку вы взяли строку файла в строку, вы можете преобразовать строку в вектор из полукокса и сделать обугленные * пункта этого вектора и передать обугленных * в следующая функция в качестве первого параметра:

char * strtok (char * str, const char * delimiters);

Второй параметр в вашем случае будет пустым пространством «». Полученный указатель char может быть затем преобразован в float, и каждый токен может быть сохранен в массиве!

int nums(char sentence[ ]) //function to find the number of words in a line 
    { 
    int counted = 0; // result 

    // state: 
    const char* it = sentence; 
    int inword = 0; 

    do switch(*it) { 
     case '\0': 
     case ' ': case '\t': case '\n': case '\r': 
      if (inword) { inword = 0; counted++; } 
      break; 
     default: inword = 1; 
    } while(*it++); 

    return counted; 
} 

int main() 
{ 
ifstream file_input (input.c_str()); 
int row=0; 
while (getline(file_input, abc)) 
{ 

vector<char> writable(abc.begin(), abc.end()); 
vector<char> buf(abc.begin(), abc.end()); 

writable.push_back('\0'); 
buf.push_back('\0'); 

char *line=&writable[0]; 

char *safe=&buf[0]; 


char* s= "123.00"; 

     float array[100]; 
     char *p; 
     int i=0; 

     p= strtok (line, " "); 
     array[i]=atof(p); 
     cout<<" "<<array[i]; 

     i++; 
     while (i<nums(safe)) 
      { 
       p = strtok (NULL, " "); //returns a pointer to the token 
       array[i]=atof(p); 
       cout<<" "<<array[i]; 
       i++; 
      } 
    return 0; 
} 

К сожалению цикл: (! Р = NULL) пока не работает, и в результате ошибки сегментации, так что я должен был заранее рассчитать количество слов в строке, используя другой вектор начиная с strtok() изменяет строку, переданную как char *.

Смежные вопросы