鱼C论坛

 找回密码
 立即注册
查看: 2258|回复: 4

[已解决]如何将文件指针指向文件的末尾 以及如何让处理从文件读出的数据分别存放到结构体中

[复制链接]
发表于 2019-7-15 13:07:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <iostream>
#include <string>
#include <fstream>

struct Message
{
        std::string name;
        std::string idcard;
        char sex;                //F代表女性 M代表男性
};

void Message_Init(struct Message *message)
{
        //fstream fp("text.txt",std::ios::in|syd::ios::out);
        std::ofstream in("test.txt");
        if(!in)
        {
                std::cerr<<"文件打开失败!"<<std::endl;
                return;
        }
        message->name="小甲鱼";
        message->idcard="小甲鱼——000000";
        message->sex='M';
        in<<message->name<<'\0';
        in<<message->idcard<<'\0';
        in<<message->sex;
        in<<std::endl;
        in.close();
}

int hint_cin()
{
        int x;
        std::cout<<"请选择需要进行的操作"<<std::endl;
        std::cout<<"1.打印数据到屏幕"<<std::endl;
        std::cout<<"2.录入数据"<<std::endl;
        std::cout<<"3.退出程序"<<std::endl;
        std::cin>>x;
        while(!std::cin.good())
        {
                std::cout<<"输入错误,请重新时输入";
                std::cin.clear();
                std::cin.ignore(100,'\n');
                std::cin>>x;
        }
        return x;
}

void pint()
{
        struct Message temp;
        std::ifstream out("test.txt");
        out>>temp.name;
        out>>temp.idcard;
        out>>temp.sex;
        std::cout<<"正在输出记录数据"<<std::endl;
        std::cout<<"  姓名      身份证       性别"<<std::endl;
        std::cout<<temp.name<<" "<<temp.idcard<<"    "<<temp.sex<<std::endl;
}

void enter()
{
        struct Message temp;
        std::ofstream in("test.txt");
        if(!in)
        {
                std::cerr<<"文件打开失败!"<<std::endl;
                return;
        }
//        in.seekg(std::ios::end);//使得文件指针指向文件尾 ios::beg则是文件头
        std::cout<<"请输入姓名:";
        std::cin>>temp.name;
        std::cout<<"请输入身份证:";
        std::cin>>temp.idcard;
        std::cout<<"请输入性别:";
        std::cin>>temp.sex;
        in<<temp.name<<'\0'<<temp.idcard<<'0'<<temp.sex<<std::endl;
}

int main()
{
        int flag=0;
        struct Message a;
        Message_Init(&a);
        while(1)
        {
                flag=hint_cin();
                switch(flag)
                {
                case 1:
                        pint();break;                //打印数据
                case 2:
                        enter();break;                //输出数据
                case 3:
                        return 0;                        //退出程序
                }
                std::cout<<"\n\n";
        }
        return 0;
}

此程序是一个信息录入程序 但是每次重新录入信息时会将原来的信息覆盖,因为操作文件的时候文件指针不能指向文件尾 in.seekg(std::ios::end);这行代码这样写会报错
还有就是从文件夹内读出数据怎么分别存放到结构体变量当中去呢?我现在读出文件夹内的数据他会全部存放到结构体变量的第一个字符串中 无法分别存放,请大家赐教,谢谢
最佳答案
2019-7-15 13:42:12
std::ofstream in("test.txt",std::ios::app); 这样就会追加到文件尾!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-15 13:42:12 | 显示全部楼层    本楼为最佳答案   
std::ofstream in("test.txt",std::ios::app); 这样就会追加到文件尾!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-15 13:55:05 | 显示全部楼层
更没有办法从文件里面读出的数据直赋值给一个结构体,因为string的长度不定。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-7-16 17:46:42 | 显示全部楼层
你说“此程序是一个信息录入程序 但是每次重新录入信息时会将原来的信息覆盖”那是因为有一种方式叫做std::ofstream in("test.txt",std::ios::app);,它只会将数据连接到文件尾部,不会将原来的文件覆盖带掉。既然用了c++,为什么不用类呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-27 20:25:08 | 显示全部楼层
mqcake 发表于 2019-7-15 13:55
更没有办法从文件里面读出的数据直赋值给一个结构体,因为string的长度不定。

那有好的解决办法吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-4 01:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表