关于文件读取求助

qq20004604
博客专家认证
2016-02-08 05:03:21
	ifstream one;
.....省略
one >> temp; //temp是int类型
while (temp != id) //读取到ID符合那行为止
{
while (one.get(q) && q != ','); //读取到逗号为止——读取有效数据之前的代码,q是char类型
one >> temp;
cout << "," << temp << "," << id << endl;
}


读取的文件是
引用
//存放卡牌文件
//品质:1普通2优质3精良4史诗5传奇6神话
//顺序为:ID 名字 品质 基础生命系数 基础攻击系数 基础防御系数

,4 3 3 2 1 1 , //,用来表示终止符
//第一行为每个级别的英雄数上限,品质1~6

0 宅男 1 2.0 2.0 1.0,
1 普通人 1 2.2 1.9 0.9,


代码思路是
①我本来想着直接读取4,但是好像不行(不过不明白为什么不行,我记得之前读取是可以的呀),于是我读取掉其他的,一直读取到第一个逗号为止;
②读取第一行数字中符合我要求的那个(正确读取了);
③扔掉剩余的内容,用while (one.get(q) && q != ',');扔掉
④从下一行“宅男”那一行开始读取,先读取第一个数字,符合要求,则依次读取那一行的所有数据,不符合要求,则扔掉那一行,读取下一行;

但问题在于:
①代码会读取双斜线后的内容(不明白,怎么避免读取?)
②在while中,会无限读取【,4 3 3 2 1 1 , //,用来表示终止符】这一行,无法做到不符合要求则扔掉(我之前是用string类读取时发现的)

求解我的代码问题在哪,如何解决
...全文
173 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hongwenjun 2016-02-08
  • 打赏
  • 举报
回复
http://cppblog.com/Sandywin/archive/2007/07/13/27984.html stringstream 字符串流,可以把 string 转换成一个流代替输入了 也可以 直接把一个文件 读取加载成一个流
qq20004604 2016-02-08
  • 打赏
  • 举报
回复
引用 4 楼 hongwenjun 的回复:
#include <iostream>     // std::cout
#include <string>
#include <fstream>      // std::ifstream
#include <sstream>      // std::ifstream
using namespace std;

int main()
{
    ifstream infile("card.TXT");
    string line ;



    //顺序为:ID 名字 品质 基础生命系数 基础攻击系数 基础防御系数
    int id;
    string name;
    int pz;
    double jc[3];

    while (getline(infile, line)) {

        // 排除空行 和 注释行
        if (line.size() <  3   || line[0] == '/')
            continue;

        // 品质行读取
        if (line[0] == ',') {
            cout << "品质行" << line << endl;
            continue;

        }

        stringstream oss;
        // 卡牌读取
        oss << line; // 转换成流
        oss >> id >> name >> jc[0]  >> jc[1]  >> jc[2] ;   // 读取一行流

        // 测试
        cout << id << name << jc[0]  << jc[1]  << jc[2] << endl;



    }

    return 0;
}
/*  输出结果
品质行,4 3 3 2 1 1 ,    //q用来表示终止符
0宅男122
1普通人12.21.9
2工人12.51.7
3学生11.82.2
100黑市拳手232.5
101红棍打手22.82.4
102百年僵尸23.22.6
200少年东伯雪鹰343
201隐杀家明333.5
202永夜君王千夜33.43.3
300战神级强者458
301一人破军47.58.3
400行者孙5914
500半步基因锁五阶61322
*/
这样测试可以正确读取了,不需要逗号
非常感谢,我这里也可以运行,我照着修改一下我的代码 另外请问一下,头文件<sstream>是做什么用的?我搜了一下,貌似是说跟string类有关是么?
hongwenjun 2016-02-08
  • 打赏
  • 举报
回复
        stringstream oss;
        // 卡牌读取
        oss << line; // 转换成流
        oss >> id >> name >> pz >> jc[0]  >> jc[1]  >> jc[2] ;  // 读取一行流

        // 测试
        cout << id << name << pz << jc[0]  << jc[1]  << jc[2] << endl;
这里改下,刚才忘记读取 pz了
hongwenjun 2016-02-08
  • 打赏
  • 举报
回复
#include <iostream>     // std::cout
#include <string>
#include <fstream>      // std::ifstream
#include <sstream>      // std::ifstream
using namespace std;

int main()
{
    ifstream infile("card.TXT");
    string line ;



    //顺序为:ID 名字 品质 基础生命系数 基础攻击系数 基础防御系数
    int id;
    string name;
    int pz;
    double jc[3];

    while (getline(infile, line)) {

        // 排除空行 和 注释行
        if (line.size() <  3   || line[0] == '/')
            continue;

        // 品质行读取
        if (line[0] == ',') {
            cout << "品质行" << line << endl;
            continue;

        }

        stringstream oss;
        // 卡牌读取
        oss << line; // 转换成流
        oss >> id >> name >> jc[0]  >> jc[1]  >> jc[2] ;   // 读取一行流

        // 测试
        cout << id << name << jc[0]  << jc[1]  << jc[2] << endl;



    }

    return 0;
}
/*  输出结果
品质行,4 3 3 2 1 1 ,    //q用来表示终止符
0宅男122
1普通人12.21.9
2工人12.51.7
3学生11.82.2
100黑市拳手232.5
101红棍打手22.82.4
102百年僵尸23.22.6
200少年东伯雪鹰343
201隐杀家明333.5
202永夜君王千夜33.43.3
300战神级强者458
301一人破军47.58.3
400行者孙5914
500半步基因锁五阶61322
*/
这样测试可以正确读取了,不需要逗号
qq20004604 2016-02-08
  • 打赏
  • 举报
回复
引用 2 楼 hongwenjun 的回复:
#include <iostream>     // std::cout
#include <string>
#include <fstream>      // std::ifstream
#include <sstream>      // std::ifstream
using namespace std;

int main()
{
    ifstream infile("card.TXT");
    string line ;

    stringstream oss;
    int id;

    while (getline(infile, line)) {

        // 排除空行 和 注释行
        if (line.size() <  3   || line[0] == '/')
            continue;


        cout << line << endl;





    }

    return 0;
}
/*  输出结果
4 3 3 2 1 1 ,   //,用来表示终止符
0       宅男    1       2.0     2.0     1.0,
1       普通人  1       2.2     1.9     0.9,
*/
我的思路是这样的。但实际出问题了。 我贴个更全的代码
	using namespace std;
	if (i == 0)
	{
		srand(unsigned int(time(0)));
		int ra = rand() % 10000;
		if (ra < 3000)quality = 1;	//白色30%
		else if (ra < 6000)quality = 2;	//绿色30%
		else if (ra < 8000)quality = 3;	//蓝色20%
		else if (ra < 9500)quality = 4;	//紫色15%
		else if (ra < 9980)quality = 5;	//橙色4.8%
		else quality = 6;	//神话0.2%
							//决定抽卡的品质
	}
	else quality = i;

	ifstream one;
	one.open("card.txt");
	if (!one.is_open())
	{
		cout << "card.txt文件(用于存储卡牌信息)损坏" << endl;
		system("pause");
	}

	char q;
	while (one.get(q) && q != ',');	//读取到逗号为止——读取有效数据之前的代码

	int temp = 0;
	for (int i = 0;i < quality;i++)
		one >> temp;	//读取当前品质卡的数量
	string tem;
	getline(one, tem);	//读取掉第一行全部
	id = (quality - 1) * 100 + rand() % temp;	//决定卡的ID,注意,每个卡片数量不能低于1,必须要有卡
	one >> temp;
	while (temp != id)	//读取到ID符合那行为止
	{
		getline(one, tem);
		one >> temp;
		cout << tem << "," << temp << "," << id << endl;
		system("pause");
	}

	cout << "抽取中";
	cout << endl;
	one >> name >> quality >> base_hp >> base_atk >> base_def;	//读取五个属性
显示:
引用
欢迎来到卡牌游戏~ 1.读取存档 2.新建人物 ->2 请输入玩家姓名:王 由于是新建人物,因此获得一次抽取卡牌的机会 2 1 1 q //q用来表示终止符,3,201 请按任意键继续. . . 2 1 1 q //q用来表示终止符,3,201 请按任意键继续. . . 2 1 1 q //q用来表示终止符,3,201 请按任意键继续. . .
文件内容为:
引用
//存放卡牌文件 //品质:1普通2优质3精良4史诗5传奇6神话 //顺序为:ID 名字 品质 基础生命系数 基础攻击系数 基础防御系数 ,4 3 3 2 1 1 , //q用来表示终止符 //第一行为每个级别的英雄数上限,品质1~6 0 宅男 1 2.0 2.0 1.0, 1 普通人 1 2.2 1.9 0.9, 2 工人 1 2.5 1.7 1.2, 3 学生 1 1.8 2.2 1.0, 100 黑市拳手 2 3.0 2.5 1.5, 101 红棍打手 2 2.8 2.4 1.6, 102 百年僵尸 2 3.2 2.6 1.3, 200 少年东伯雪鹰 3 4.0 3.0 2.0, 201 隐杀家明 3 3.0 3.5 1.8, 202 永夜君王千夜 3 3.4 3.3 1.9, 300 战神级强者 4 5.0 8.0 3.0, 301 一人破军 4 7.5 8.3 2.9, 400 行者孙 5 9.0 14.0 4.0, 500 半步基因锁五阶 6 13.0 22.0 6.0,
所以很奇怪的说
hongwenjun 2016-02-08
  • 打赏
  • 举报
回复
#include <iostream>     // std::cout
#include <string>
#include <fstream>      // std::ifstream
#include <sstream>      // std::ifstream
using namespace std;

int main()
{
    ifstream infile("card.TXT");
    string line ;

    stringstream oss;
    int id;

    while (getline(infile, line)) {

        // 排除空行 和 注释行
        if (line.size() <  3   || line[0] == '/')
            continue;


        cout << line << endl;





    }

    return 0;
}
/*  输出结果
4 3 3 2 1 1 ,   //,用来表示终止符
0       宅男    1       2.0     2.0     1.0,
1       普通人  1       2.2     1.9     0.9,
*/
hongwenjun 2016-02-08
  • 打赏
  • 举报
回复
你的文件读入 数据文件 样本看下 你可以 每次读入一行,然后 切割一行就可以了

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧