c ++ Как разобрать файл в вектор структур - PullRequest
0 голосов
/ 15 марта 2019

У меня есть файл с данными, отформатированными следующим образом:

1.000 -1.000 1.000

b 7,89 4,56 2,46

c 50 20 10

Я начал писать код для разбора файла и сохранения данных в векторе структур, но я не уверен, как это закончить.

struct Coordinates
{
    double x;
    double y;
    double z;
}

vector<Coordinates> aVec; 
vector<Coordinates> bVec;  
vector<Coordinates> cVec;  

ifstream exampleFile;
exampleFile.open("example.txt");

// parse file
while(getline(exampleFile, str))
{
    if(str[0] == "a")
    {
        Coordinates temp;
        temp.x = firstNum; // this is where I'm stuck
        temp.y = secondNum;
        temp.z = thirdNum;
        vertVec.push_back(temp);
    }
    if(str[0] == "b")
    {
        Coordinates temp;
        temp.x = firstNum;
        temp.y = secondNum;
        temp.z = thirdNum;
        vertVec.push_back(temp);
    }
    if(str[0] == "c")
    {
        Coordinates temp;
        temp.x = firstNum;
        temp.y = secondNum;
        temp.z = thirdNum;
        vertVec.push_back(temp);
    }
}

Ответы [ 2 ]

1 голос
/ 15 марта 2019

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

 std::ifstream    file("Data");   // This represents a file as a stream
 std::cin                         // This is a stream object that represents
                                  // standard input (usually the keyboard)

Они оба наследуются от std::istream.Таким образом, они оба действуют одинаково при передаче функциям, использующим потоки.

 int value;
 std::cin >> value;   // The >> operator reads from a stream into a value.

Сначала напишите структуру, чтобы она знала, как читать себя из потока.

struct Coordinates
{
    double x;
    double y;
    double z;

    // This is an input function that knows how to read 3
    // numbers from the input stream into the object.
    friend std::istream& operator>>(std::istream& str, Coordinates& data)
    {
         return str >> data.x >> data.y >> data.z;
    }
}

Теперь напишите несколькокод, который читает объекты типа Coordinate.

int main()
{
     // Even if you only have a/b/c using a map to represent these
     // values is better than having three different vectors
     // as you can programmatically refer to the different vectors
     std::map<char, std::vector<Coordinates>>    allVectors;


     char         type;
     Coordinates  value;

     // Read from the stream in a loop.
     // Read the type (a/b/c)
     // Read a value (type Coordinates)
     while(std::cin >> type >> value)
     {
         // If both reads worked then
         // select the vector you want and add the value to it.
         allVectors[type].push_back(value);
     }
}
0 голосов
/ 15 марта 2019

Вместо использования

if(str[0] == "a")
{
    Coordinates temp;
    temp.x = firstNum; // this is where I'm stuck
    temp.y = secondNum;
    temp.z = thirdNum;
    vertVec.push_back(temp);
}

используйте следующее:

// Construct a istringstream from the line and extract the data from it

std::istringstream istr(str);
char token;
Coordinates temp;

if ( istr >> token >> temp.x >> temp.y >> temp.z )
{
   // Use the data only if the extractions successful.
   if ( token == 'a' ) // Please note that it's not "a"
   {
      // Do the right thing for a
   }

   // Add other clauses.

}
else
{
   // Deal with the error.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...