使用分隔符读取C ++文件

时间:2018-08-26 07:24:11

标签: c++ ifstream getline

名称〜专有名称〜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 :(得分:1)

您的代码有很多错误。由于某种原因,您已经复制了变量名,您的输入循环永不终止,并且您已经询问了有关输入循环内星号的问题。我想说您是在不考虑自己在做什么或不知道要去哪里的情况下急于进行编码。

让我们一次吃一次。

您拥有的第一件事是一堆有关恒星,名称,专有名称,距离等的相关数据。因此,通过将相关数据分组为一个结构来表达这一事实

private static String GetSASToken(String resourceUri, String keyName, String key)
{
    long epoch = System.currentTimeMillis()/1000L;
    int week = 60*60*24*7;
    String expiry = Long.toString(epoch + week);

    String sasToken = null;
    try {
        String stringToSign = URLEncoder.encode(resourceUri, "UTF-8") + "\n" + expiry;
        String signature = getHMAC256(key, stringToSign);
        sasToken = "SharedAccessSignature sr=" + URLEncoder.encode(resourceUri, "UTF-8") +"&sig=" +
                URLEncoder.encode(signature, "UTF-8") + "&se=" + expiry + "&skn=" + keyName;
    } catch (UnsupportedEncodingException e) {

        e.printStackTrace();
    }

    return sasToken;
}


public static String getHMAC256(String key, String input) {
    Mac sha256_HMAC = null;
    String hash = null;
    try {
        sha256_HMAC = Mac.getInstance("HmacSHA256");
        SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(), "HmacSHA256");
        sha256_HMAC.init(secret_key);
        Encoder encoder = Base64.getEncoder();

        hash = new String(encoder.encode(sha256_HMAC.doFinal(input.getBytes("UTF-8"))));

    } catch (InvalidKeyException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    return hash;
}

现在,让我们编写一个循环以读取数据,并在没有更多数据时重要地完成

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)) { } 变量中。但是到目前为止,这些数据还没有做任何事情。

有多种存储数据的方法,以便可以搜索它们,这是很常见的事情,因此C ++可以为您完成大部分工作。我将使用一种称为data的东西,它是一种非常擅长存储数据以便可以对其进行搜索的数据结构。让我们修改上面的循环

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,所以我们将能够使用适当的名称来查找有关恒星的数据。

现在,我们已经完成了while循环,让我们问一下要向上看的星星的问题,请记住这是在上述while循环之后发生的,而不是在其中进行的。

star_database[data.properName] = data;

现在我们要进行查找

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

我已经跳过了很多细节(我只能解释很多),但希望您有基本的想法,并且可以自己研究其余部分。

所有代码未经测试,对于任何错别字都提前致歉。