m0_63989703 2022-04-13 20:22 采纳率: 87.5%
浏览 612
已结题

c++重载文件流写入txt文件出现乱码

我的目的是用过这段程序分别向一个txt文本写入信息和向另一个txt文本以二进制形式写入信息,但是运行过后两个txt内容一样,有些信息是正确的有些是乱码,应该二进制录入信息的文本中内容和第一个文本一样,代码如下:

#include <iostream>
#include <fstream>
using namespace std;
class Student
{
private:
    char no[10], name[20], sex[10];
    char major[20], phone[20], addr[30];
public:
    friend istream & operator>>(istream &, Student &);
    friend ostream & operator<<(ostream &, Student &);
    void writeTo(char filename[]);
    void readFrom(char filename[]);
    void writeTobinary(char filename[]);
    void readFrombinary(char filename[]);
};
istream & operator>>(istream & input, Student & s)
{
    cout << "输入学生数据:" << endl;
    cout << "学号:";
    input >> s.no;
    cout << "姓名:";
    input >> s.name;
    cout << "性别:";
    input >> s.sex;
    cout << "专业:";
    input >> s.major;
    cout << "电话:";
    input >> s.phone;
    cout << "地址:";
    input >> s.addr;
    return input;
}
ostream & operator<<(ostream & output, Student & s)
{
    output << "输出学生数据:" << endl;
    output << "学号:" << s.no << endl;
    output << "姓名:" << s.name << endl;
    output << "性别:" << s.sex << endl;
    output << "专业:" << s.major << endl;
    output << "电话:" << s.phone << endl;
    output << "地址:" << s.addr << endl;
    return output;
}
void Student::writeTobinary (char filename[])
{
    ofstream outFile;
    outFile.open(filename,ios::binary|ios::out);
    if(!outFile) cerr<<"open error!"<<endl;
    else outFile.write((char *)this, sizeof *this);
    outFile.close();
}
void Student::readFrombinary (char filename[])
{
    ifstream inFile;
    inFile.open(filename,ios::binary|ios::in);
    if(!inFile) cerr<<"open error!"<<endl;
    inFile>>no>>name>>sex>>major>>phone>>addr;
    inFile.close();
}

void Student::writeTo (char filename[])
{
    ofstream outFile;
    outFile.open(filename,ios::out);
    if(!outFile) cerr<<"open error!"<<endl;
    else outFile.write((char *)this, sizeof *this);
    outFile.close();
}
void Student::readFrom (char filename[])
{
    ifstream inFile;
    inFile.open(filename,ios::in);
    if(!inFile) cerr<<"open error!"<<endl;
    inFile>>no>>name>>sex>>major>>phone>>addr;
    inFile.close();
}


int main(int argc, char* argv[])
{
    Student stu1,stu2;
    cin >> stu1;
    stu1.writeTo("D:\\stu1.txt");
    stu1.readFrom("D:\\stu1.txt");
    cout << stu1;

    cin >> stu2;
    stu2.writeTobinary("D:\\stu2.txt");
    stu2.readFrombinary("D:\\stu2.txt");
    cout << stu2;

    return 0;
}


如何解决?

  • 写回答

3条回答 默认 最新

  • 关注

    写文件都是用二进制write,读文件都是用文本 >> 方式,这样输入输出有问题。

    一般文本方式写入用<<,读用>>。二进制写入用write,读取用read。不能混。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月28日
  • 已采纳回答 4月20日
  • 创建了问题 4月13日

悬赏问题

  • ¥100 ijkplayer使用AndroidStudio/CMake编译,如何支持 rtsp 直播流?
  • ¥20 和学习数据的传参方式,选择正确的传参方式有关
  • ¥15 这是网络安全里面的poem code
  • ¥15 用js遍历数据并对非空元素添加css样式
  • ¥15 使用autodl云训练,希望有直接运行的代码(关键词-数据集)
  • ¥50 python写segy数据出错
  • ¥20 关于线性结构的问题:希望能从头到尾完整地帮我改一下,困扰我很久了
  • ¥30 3D多模态医疗数据集-视觉问答
  • ¥20 设计一个二极管稳压值检测电路
  • ¥15 内网办公电脑进行向日葵