| 网站首页 | 业界新闻 | 小组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 283 人关注过本帖
标题:各位大佬求助 我是小白 请多指教我谢谢
只看楼主 加入收藏
一个小罗斯
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2019-10-11
结帖率:100%
  已结贴   问题点数:10  回复次数:4   
各位大佬求助 我是小白 请多指教我谢谢

#include <iostream>   
#include <algorithm>   
#include <vector>
#include <fstream>
#include <memory.h>   

using namespace std;
struct billion
{
    int no;
    char name[20];
    char account[6];
    int age;
    char company[20];
    char country[20];
};
ostream&  operator<<(ostream& os, billion &b)
{
    os << "编号" << '\t' << "姓名" << "\t\t" << "国家" << "\t\t" << "公司" << '\t' << "年龄" << '\t' << "资产" << endl;
    os << b.no << '\t' << b.name << '\t' << b.country << '\t' << << '\t' << b.age << '\t' << b.account << endl;
    return os;
}
class find_billion
{
private:
    billion b;
    char* country;
    int min;
    int max;
public:
    find_billion()
    {
        memset(this->country, NULL, sizeof(this->country));
        min = 0;
        max = 0;
    }
    find_billion(char *country, int min, int max)
    {
        this->country = country;
        this->min = min;
        this->max = max;
    }
    void operator()(billion b)
    {
        if (b.age > min && b.age < max && !strcmp(b.country, country))
        {
            cout << b << endl;
        }
    }
};
int main()
{
    ifstream in;
    in.open("d:\\billion.bin");
    vector<billion>v;
    billion b;
    in.read((char *)&b, sizeof(billion));
    while (!in.eof())
    {
        in.read((char *)&b, sizeof(billion));
        v.push_back(b);
    }

    find_billion bil = for_each(v.begin(), v.end(), find_billion("China", 60, 70));
    in.close();
    return 0;
}
附件: 您没有浏览附件的权限,请 登录注册
搜索更多相关主题的帖子: max char int min include 
2019-10-11 18:11
uouo99
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:3
帖 子:29
专家分:88
注 册:2019-9-30
  得分:0 
感觉
    //find_billion bil = for_each(v.begin(), v.end(), find_billion("China", 60, 70));
换成
    for_each(v.begin(), v.end(), find_billion());
才对。

第三个参数貌似是需要一个可调用对象,可以是函数或函数对象,每次for_each循环的时候,都会把v.begin到v.end()范围内的一个元素作为值传递给find_billion。
2019-10-11 23:54
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:328
帖 子:6785
专家分:39361
注 册:2011-1-18
  得分:0 
你这代码中的 class find_billion 都是低级错误
class find_billion
{
private:
    billion b; // 这干什么用的?
    char* country;
    int min;
    int max;
public:
    find_billion()
    {
        memset(this->country, NULL, sizeof(this->country)); // 向内存未知处写入数据?
        min = 0;
        max = 0;
    }
    find_billion(char *country, int min, int max) // country指向的字符串必须是可修改的?但实际上你传入的却是"China"
    {
        this->country = country; // 你能确保 country 是持久存在的吗?否则保存其地址有什么意义
        this->min = min;
        this->max = max;
    }
    void operator()(billion b)
    {
        if (b.age > min && b.age < max && !strcmp(b.country, country))
        {
            cout << b << endl;
        }
    }
};

int main()
{
    ifstream in;
    in.open("d:\\billion.bin");
    vector<billion>v;
    billion b;
    in.read((char *)&b, sizeof(billion)); // 你确定in被成功打开了,且有足够数据?第二,结合下面的代码来看,为什么这条数据要被舍弃而不被 v.push_back(b) ?
    while (!in.eof()) // 多么外行且错误的做法呀
    {
        in.read((char *)&b, sizeof(billion));
        v.push_back(b);
    }

    find_billion bil = for_each(v.begin(), v.end(), find_billion("China", 60, 70)); // 从你的 class find_billion 定义来看,根本没有状态返回,find_billion bil = 有啥存在意义?
    in.close();
    return 0;
}

而你贴图中的第二个错误,要么禁止掉VC恶心的“预编译头”功能,要么你就照VC要求的那样,最前面加上 #include "pch.h"


2019-10-12 09:49
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:328
帖 子:6785
专家分:39361
注 册:2011-1-18
  得分:0 
还忘了写一个大错误,in.read((char *)&b, sizeof(billion)) 等既然以二进制格式读取文件,那么 in.open("d:\\billion.bin"); 必须指明是二进制方式打开才行
2019-10-12 10:06
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:328
帖 子:6785
专家分:39361
注 册:2011-1-18
  得分:10 
仅仅是 演示 一下
程序代码:
#include <iostream>

struct billion
{
    int no;
    char name[20];
    char account[6];
    int age;
    char company[20];
    char country[20];
};

std::ostream& operator<<( std::ostream& os, const billion& b )
{
    return os << b.no << '\t' << b.name << '\t' << b.country << '\t' <<  << '\t' << b.age << '\t' << b.account;
}

#include <algorithm>
#include <vector>
#include <fstream>
#include <cstring>
using namespace std;

int main( void )
{
    // 用于生产测试文件 "d:\\billion.bin"
    {
        ofstream file( "d:\\billion.bin", ios::binary );
        billion bs[] = { { 1, "name1", "ac1", 60, "comp1", "China" }
                       , { 2, "name2", "ac2", 62, "comp2", "China" }
                       , { 3, "name3", "ac3", 64, "comp3", "USA"   }
                       , { 4, "name4", "ac4", 66, "comp4", "China" }
                       , { 5, "name5", "ac5", 70, "comp5", "China" } };
        file.write( (char*)bs, sizeof(bs) );
    }
   

    ifstream in( "d:\\billion.bin", ios::binary );
    if( !in )
    {
        cerr << "文件打开失败.\n";
        return 1;
    }

    vector<billion> v;
    for( billion b; in.read((char*)&b,sizeof(b)), in.gcount()==sizeof(b); )
        v.push_back( b );
    if( in.bad() || in.gcount()!=0 )
    {
        cerr << "文件读取失败.\n";
        return 2;
    }

    cout << "编号" << '\t' << "姓名" << '\t' << "国家" << '\t' << "公司" << '\t' << "年龄" << '\t' << "资产" << '\n';
    for_each( v.begin(), v.end(), [](const auto& b) {
            if( b.age>60 && b.age<70 && strcmp(b.country,"China")==0 )
                cout << b << '\n';
        } );

    return 0;
}

输出
编号    姓名    国家    公司    年龄    资产
2       name2   China   comp2   62      ac2
4       name4   China   comp4   66      ac4

2019-10-12 10:27
快速回复:各位大佬求助 我是小白 请多指教我谢谢
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.069390 second(s), 8 queries.
Copyright©2004-2019, BCCN.NET, All Rights Reserved