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

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日

悬赏问题

  • ¥15 PointNet++的onnx模型只能使用一次
  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。