2013-10-12 2 views
1

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

MissionPlan.cpp:190: error: invalid conversion from ‘void*’ to ‘char**’
MissionPlan.cpp:190: error: cannot convert ‘float’ to ‘size_t*’ for argument ‘2’ to ‘__ssize_t getline(char**, size_t*, FILE*)

Это моя структура:

struct CivIndexDB { 
float civInd; 
int x; 
int y; 
} 

Это мое пример текстового файла:

3.2341:2:3
1.5234:3:4

Это код, который я использую для извлечения данных из текстового файла, а затем хранить его в векторе:

string line = ""; 
while (getline(civIndexFile,line)) { 
    stringstream linestream(line); 

    getline(linestream,civDb.civInd,':'); 
    getline(linestream,civDb.x,':'); 
    getline(linestream,civDb.y); 
    civIndexesList.push_back(civDb);    
} 

Изменение типов переменных в структуре на строку не то, что мне нужно, как позже в приложении, мне нужно отсортировать векторные значения на основе его значения float.

Я ценю любую помощь. Благодаря!

+0

Почему бы вам не использовать двоичные файлы? Я не помню, как писать двоичный файл, но я думаю, что в вашем примере они более подходят. – MRB

+1

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

+0

@john, если переменные struct имеют строковый тип, тогда данные, хранящиеся в векторе, должны быть строковыми. Даже если я преобразую строку в нужный мне тип, мне все равно понадобится вектор, способный хранить float, int, int (который, я думаю, невозможен), и отсортировать его позже. –

ответ

3

Не глядя в ваши точные проблемы/ошибки, я предлагаю, если формат файла фиксируется простым способом было бы:

char ch; // For ':' 
while (civIndexFile >> civDb.civInd >> ch >> civDb.x >> ch >> civDb.y) 
{ 
    civIndexesList.push_back(civDb); 
} 

Редактировать

Для сортировки по значениям с плавающей точкой может привести к перегрузке < оператор:

struct CivIndexDB { 
    float civInd; 
    int x; 
    int y; 

    bool operator <(const CivIndexDB& db) const 
    { 
    return db.civInd > civInd; 
    } 
}; 

И затем использовать std::sort:

std::sort(civIndexesList.begin(), civIndexesList.end());

+0

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

+0

@JoelSeah Почему вы меняете формат файла, 'float: int: int' отлично работает с кодом выше. Попробуйте [this] (http://pastebin.com/6vhiVH6U) код, измените имя файла – P0W

+0

, не просили меня изменить файл с текста на двоичный, а затем с помощью вышеуказанного кода проверить его? –

0

Как насчет этого?

#include <vector> 
#include <cstdlib> 
#include <sstream> 
#include <string> 
#include <fstream> 
#include <iostream> 

struct CivIndexDB { 
    float civInd; 
    int x; 
    int y; 
}; 

int main() { 
    std::ifstream civIndexFile; 
    std::string filename = "data.dat"; 

    civIndexFile.open(filename.c_str(), std::ios::in); 

    std::vector<CivIndexDB> civ; 
    CivIndexDB cid; 

    if (civIndexFile.is_open()) { 
     std::string temp; 

     while(std::getline(civIndexFile, temp)) { 
      std::istringstream iss(temp); 
      int param = 0; 
      int x=0, y=0; 
      float id = 0; 

      while(std::getline(iss, temp, ':')) { 
       std::istringstream ist(temp); 
       if (param == 0) { 
        (ist >> id) ? cid.civInd = id : cid.civInd = 0; 
       } 
       else if (param == 1) { 
        (ist >> x) ? cid.x = x : cid.x = 0; 
       } 
       else if (param == 2) { 
        (ist >> y) ? cid.y = y : cid.y = 0; 
       } 
       ++param; 
      } 
      civ.push_back(cid); 
     } 
    } 
    else { 
     std::cerr << "There was a problem opening the file!\n"; 
     exit(1); 
    } 

    for (int i = 0; i < civ.size(); ++i) { 
     cid = civ[i]; 
     std::cout << cid.civInd << " " << cid.x << " " << cid.y << std::endl; 
    } 

    return 0; 
} 
Смежные вопросы