C ++从文本文件

时间:2015-09-16 01:23:43

标签: c++ ifstream

首先让我首先感谢那些经常在这里发帖的人,过去几年我在这个网站上获得了大量的知识。

好的,之前已经问过这个问题,但我有一点点麻烦,我无法工作。

这是我的结构。

struct person
{
    string Sex;
    string Name;
    string Match;
    int phoneNumber;
    int numInterests;
    vector<string> interests;
};

该作业被设计为约会计划&#34;这与具有相似兴趣的异性人士相匹配。

以下是遵循以下格式的示例文本文件:

&#34;性别&#34; &#34;名称&#34; &#34;电话号码&#34; &#34;兴趣量&#34; &#34;兴趣列表&#34; &#34;匹配(如果找到匹配)&#34;

M Tyler 1234567890 3 soccer football tv Jess
F Lyns 1234567890 3 hockey sex movies
F Jess 1234567890 3 soccer football tv Tyler
M Taylor 1234567890 3 hockey sex movies

在该示例文件中,Jess和Tyler匹配。 到目前为止,这是我的职能......

void LoadClients(std::ifstream &file,vector<person>& peps)
{
    string sex,name,interests,line, match;
    double phone,ni;
    person p;
    for(int i=0;i<maxPeople("Clients.mf"); i++){
        file>>sex>>name>>phone>>ni;
        p.Sex = sex;
        p.Name = name;
        p.phoneNumber = phone;
        p.numInterests = ni;
        for (int i=0; i<ni; i++){
            file >> line;
            p.interests.push_back(line);
        }
        file >> match;
        p.Match = match;
        peps.push_back(p);

       // person p;
        //istringstream iss( line );
    }

};

函数编译但根本无法正确读取。这是我工作的其余部分,万一你想看到它......

int maxPeople(const char* file)///Just returns the number of lines in the file
{
    ifstream inFile(file);
    int c = count(istreambuf_iterator<char>(inFile),
            istreambuf_iterator<char>(), '\n');
    return c;
}
int main()
{
    int numberOfClients=maxPeople("Clients.mf");
    ifstream file("Clients.mf");

    vector<person> peps;
    LoadClients(file,peps);

    return 0;
}

我的功能LoadClients是在我在此处找到的优雅答案后建模的:Reading a string and integers

我要求的是如何让这个函数从文本文件中创建一个向量或数组。

最终节目将有其他功能&#34; NewClient&#34;,&#34; UnMatch&#34;,&#34; PrintMatched&#34;和&#34; PrintSingles&#34;但我想我可以处理这些。欢迎任何和所有提示:)

感谢阅读!

EDIT1: 使用这种格式。

void LoadClients(std::ifstream &file,vector<person>& peps)  
{  
    person p;  
    string line;  
    while( getline( file, line ) )  
    {  
        istringstream iss( line );  
        iss >> p.Sex >> p.Name >> p.phoneNumber >> p.numInterests;  
        for(int i=0;i<p.numInterests;i++){  
            string interest;  
            iss >> interest;  
            p.interests.push_back(interest);  
        }  

    }  
}; 

我决定跳过&#34;匹配&#34;目前。当我从main访问对象时,我收到分段错误。

ifstream file("Clients.mf");

vector<person> peps;
LoadClients(file,peps);
for(int i=0; i<numberOfClients;i++){
    cout << peps[0].Name;
}

3 个答案:

答案 0 :(得分:3)

由于您的记录输入是基于行的,因此请使用基于行的阅读器。该程序现在的问题是它假定总是匹配。但是在输入文件的第二行,没有匹配项。因此,将读取下一个以空格分隔的文本。

我喜欢这种从文件中解析行的方法,因为它很简单:

string line;
while( getline( file, line ) )
{
    istringstream iss( line );

    // Now, parse out of 'iss' instead of 'file'.
    person p;
    bool ok = false;
    if( iss >> p.Sex >> p.Name >> p.phoneNumber >> p.numInterests )
    {
        p.interests.reserve( p.numInterests );
        for( int i = 0; i < p.numInterests; i++ )
        {
            string interest;
            if( iss >> interest ) p.interests.emplace_back( interest );
        }

        ok = !iss.error();

        iss >> p.Match; // optional
    }

    if( ok ) peps.push_back( p );
}

您可以更进一步,为Person结构定义流输入运算符。然后,主读取循环看起来像:

person p;
iss >> p;

答案 1 :(得分:1)

电话和ni(我假设的是兴趣数量)不应该是双倍的。我会把Phone变成一个字符串而ni是一个int(有些人认为没有签名但足够接近)。

Double和Float是'有损'数据类型,不适合计数或电话号码。

您实际上并没有说出行为是什么以及您期望它是什么。 我假设你的负载是乱七八糟的,这是因为这一行:

file >> match;

您不知道该行是否包含该行,因此它可能会接收下一行的第一个作品。

我会切换到使用getLine和一个字符串流,并在提取匹配之前检查该行是否为空(IE字符串流是否结束)。

答案 2 :(得分:1)

顺便说一句,string成为int phoneNumber的好主意 ,除非你喜欢你的程序来处理外星人。你的numInterests可能有问题。如果您有interests.size(),则struct Person { enum class Gender { Unknown, Male, Female, }; Gender gender; std::string name; std::string match; std::string phoneNumber; std::vector<std::string> interests; }; 是多余的。所以你可能会......

static Person::Gender readGender(std::ifstream &input) {
    char ch;
    input >> ch;
    switch(ch) {
        case 'M':
            return Person::Gender::Male;

        case 'F':
            return Person::Gender::Female;

        default:
            return Person::Gender::Unknown;
    }
}

void LoadClients(std::ifstream &file, std::vector<person> &out) {
    for(int i = 0; i < maxPeople("Clients.mf"); i++) {
        Person p;
        unsigned numInterests;

        p.gender = readGender(file);
        file >> p.name;
        file >> p.phoneNumber;
        file >> numInterests;
        for(unsigned i = 0; i < numInterests; i++){
            std::string interest;
            file >> interest;

            p.interests.push_back(interest);
        }

        file >> p.match;
        out.push_back(p);
    }
}

现在,问题。该函数应该看起来像(没有检查和C ++ 11!)...

match

编辑:您应该有一个方法让程序区分是否有$('input:focus').closest('tr').parent().find("tr:nth-child(2)").find('td:nth-child(3)').find('input') ,否则未定义的挫折会找你!

修改:由于来自OP的评论,以前的评论无效。

编辑:根据评论修正了一些陷阱。