超级无敌磊果果 发表于 2019-7-15 13:07:31

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

#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);这行代码这样写会报错
还有就是从文件夹内读出数据怎么分别存放到结构体变量当中去呢?我现在读出文件夹内的数据他会全部存放到结构体变量的第一个字符串中 无法分别存放,请大家赐教,谢谢

mqcake 发表于 2019-7-15 13:42:12

std::ofstream in("test.txt",std::ios::app); 这样就会追加到文件尾!

mqcake 发表于 2019-7-15 13:55:05

更没有办法从文件里面读出的数据直赋值给一个结构体,因为string的长度不定。

AmosAlbert 发表于 2019-7-16 17:46:42

你说“此程序是一个信息录入程序 但是每次重新录入信息时会将原来的信息覆盖”那是因为有一种方式叫做std::ofstream in("test.txt",std::ios::app);,它只会将数据连接到文件尾部,不会将原来的文件覆盖带掉。既然用了c++,为什么不用类呢?

超级无敌磊果果 发表于 2019-7-27 20:25:08

mqcake 发表于 2019-7-15 13:55
更没有办法从文件里面读出的数据直赋值给一个结构体,因为string的长度不定。

那有好的解决办法吗
页: [1]
查看完整版本: 如何将文件指针指向文件的末尾 以及如何让处理从文件读出的数据分别存放到结构体中