C ++将制表符分隔的文件读入向量并将其显示

时间:2019-03-22 03:40:03

标签: c++

我试图将制表符分隔的文件读取为字符串向量并显示它。但是我没有得到想要的输出。

这是我尝试读取并显示的文件:

1   amazon  billybob@kfc.com    password!23
2   facebook    digitalGlut3n@ello.mail fri3dMayoNaize
3   bank.com    brokeDude@sofa.com  LostTheRemot3!.Crap

这是我的显示功能:

void DisplayRecords() {

    vector<string> vRecords;
    ifstream inFile("database.txt");

    string entry;

    while (inFile >> entry) {
        vRecords.push_back(entry);
    }

    for (int i = 0; i < vRecords.size(); i++) {
        if (i % 4 == 0) {
            cout << "\n";
        }
        cout << setw(5) << vRecords[i];
    }

    cout << "\n\n";
}

这是我得到的输出:

1amazonbillybob@kfc.compassword!23
2facebookdigitalGlut3n@ello.mailfri3dMayoNaize
3bank.combrokeDude@sofa.comLostTheRemot3!.CrapPress any key to continue . . .

我如何使我的函数显示为类似于原始文件,并且字符串之间有空格?

2 个答案:

答案 0 :(得分:1)

单个字符串的向量对于结构化数据确实没有多大意义。结构向量更有意义,例如:

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

struct Record
{
    std::string id;
    std::string site;
    std::string user;
    std::string pass;
};

void DisplayRecords()
{
    std::vector<Record> vRecords;
    std::ifstream inFile("database.txt");
    std::string entry;

    while (std::getline(inFile, entry))
    {
        std::istringstream iss(entry);

        Record rec;
        std::getline(iss, rec.id, '\t');
        std::getline(iss, rec.site, '\t');
        std::getline(iss, rec.user, '\t');
        std::getline(iss, rec.pass, '\t');

        vRecords.push_back(rec);
    }

    for (int i = 0; i < vRecords.size(); ++i)
    {
        Record &rec = vRecords[i];
        std::cout << std::setw(5)  << rec.id
                  << std::setw(10) << rec.site
                  << std::setw(30) << rec.user
                  << std::setw(30) << rec.pass
                  << "\n";
    }

    std::cout << "\n";
}

答案 1 :(得分:0)

如果您的数据库文件是固定格式。

您可以通过以下代码获取答案。

void DisplayRecords() {

  vector<string> vRecords;
  ifstream inFile("database.txt");

  string entry;

  while (inFile >> entry) {
    vRecords.push_back(entry);
    vRecords.emplace_back("\t");
  }

  for (int i = 0; i < vRecords.size(); i++) {
    if (i % 8 == 0) {
      cout << "\n";
    }
    cout << setw(5) << vRecords[i];
  }

  cout << "\n\n";
}

在此代码中,在while循环中,入口变量为1,亚马逊,....

所以,我在每个字符串之间添加了制表符。

当i%8 == 0为true时,打印新行。

我希望它对您有帮助。