Чтение файла C ++ с разделителями - PullRequest
0 голосов
/ 26 августа 2018

Имя ~ Собственное имя ~ HR номер ~ HD номер ~ расстояние - формат данных в файле

include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
  string name;
  string properName;
  string hrN;
  string hdN;
  double distance;
  ifstream fin;
  string fileName;
  cout << "Enter a file name: ";
  getline(cin, fileName);
  fin.open(fileName);
  if(fin.fail())
  {
     cout << "Unable to open the file" << endl;
     return -1;
  }
  else
  {
    string name;
    string properName;
    string hrN;
    string hdN;
    double distance;
    string line;
    string pN1;
    bool found = false;
    while(true)
    {
       getline(fin, name, '~');
       getline(fin, properName,'~');
       getline(fin, hrN,'~');
       getline(fin, hdN, '~');
       fin >> distance;
       cout << "Enter a proper star name:";
       string pN1;
       cin >> pN1;
       if(pN1.compare(properName))
       {
          found = true;
          cout << "Star : "<< "proper name: "<<pN1<< "distance: "<<distance<<"light years" << "HD num: "<<hdN << "HR num: "<< hrN << "common name: "<< name << endl;

       }

   }

   if (found == false)
   {
      cout << "No star with the properName"<<" "<< pN1 <<" "<<"was found"<< endl;
   }
  fin.close();
}

 return 0;

}

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

1 Ответ

0 голосов
/ 26 августа 2018

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

Давайте возьмем по одной штуке за раз.

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

struct StarData
{
    string name;
    string properName;
    string hrN;
    string hdN;
    double distance;
};

Теперь давайте напишем цикл, который читает эти данные и, что важно,завершается, когда данных больше нет

StarData data;
// loop until no more data
while (getline(fin, data.name, '~') && getline(fin, data.properName, '~') && 
    getline(fin, data.hrN, '~') && getline(fin, data.hdN, '~') && 
    (fin >> data.distance))
{
}

Таким образом, этот цикл считывает данные звезды, по одной звезде за раз, в переменную data.Но пока что ничего не делает с этими данными.

Существуют различные способы хранения данных, чтобы они были доступны для поиска, это очень распространенная вещь, которую нужно делать, поэтому C ++ выполняет большую часть работыдля тебя.Я собираюсь использовать нечто под названием std::map, которое представляет собой структуру данных, которая очень хорошо хранит данные, поэтому их можно искать.Давайте изменим цикл выше

#include <map>

std::map<string, StarData> star_database;
StarData data;
// loop until no more data
while (getline(fin, data.name, '~') && getline(fin, data.properName, '~') && 
    getline(fin, data.hrN, '~') && getline(fin, data.hdN, '~') && 
    (fin >> data.distance))
{
    // add star data to database using proper name as the key
    star_database[data.properName] = data;
}

Этот код сохраняет данные звезды в переменной с именем star_database.В частности, потому что мы набрали карту с правильным именем, т.е. потому что мы сказали star_database[data.properName] = data; позже, мы сможем использовать правильное имя для поиска данных о звезде.

Теперь мы сделали цикл while, давайте зададим вопрос о звезде, чтобы посмотреть, помните, что это происходит после цикла while выше, а не внутри него.

cout << "Enter a proper star name:";
string pN1;
cin >> pN1;

Теперь мы выполним поиск

auto answer = star_database.find(pN1); // lookup the proper name in the database
if (answer == star_database.end()) // did we find it?
{
    cout << "No star with the proper name "<< pN1 <<" was found"<< endl;
}
else
{
    cout << "Star : "<< "proper name: "<< pN1 << 
        " distance: "<< answer->second.distance << " light years" << 
        " HD num: "<< answer->second.hdN << 
        " HR num: "<< answer->second.hrN << 
        " common name: "<< answer->second.name << endl;
}

Я пропустил довольно много деталей (я могу только так много объяснить), но, надеюсь, у вас есть основная идея и вы можете исследовать остальное самостоятельно.

Всекод не проверен, заранее извиняюсь за любые опечатки.

...