Hello World - C/C++
type: channel
link: https://blog.ricken.cn/category/C/
items: C++使用ifstream保存文件出现乱码

C++使用ifstream保存文件出现乱码
type: item
date: 2021-06-06T20:55:00+00:00
description: 事情起因帮朋友修改她的数据结构课设时，整体都几乎完善了，但运行过程中会莫名其妙地崩溃。检查了一下代码，几乎没有问题，编译器编译也是0 Waning 0 error。找着就找到了程序运行时生成的文件，发现文件中会莫名其妙出现如下乱码。另外关于此处数据导出和导入的程序如下：ofstream employee("employee.txt" , ios::out); if (!employee.is_open())//判断是否成功打开 { cout << "文件打开失败！"<<endl; exit(0); } while (l!=NULL)// 将employee类的数据逐一保存到外部文件 { employee << l->id << " " << l->name << " " << l->sex << " " << l->phone <<endl ; l = l->next; } employee.close();//关闭文件 Listfree(L);ifstream employee("employee.txt"); while (!employee.eof()) { Linklist l; Initlist(l); employee >> l->id >> l->name >>l->sex >>l->phone ; if(L->next!=NULL) { L_bat = L->next; l->next = L->next; } L->next = l; } employee.close();调查查阅资料得知：[scode type="red"]通过eof()判断文件结束，若某行只有回车也算是一行，即使在文件尾部[/scode]运行几次也是可以验证，就是数据导出时的换行符生成的新行影响了数据读取，进而导致乱码。处理目前个人想到的一个处理过程就是：对最后一行"多余"的数据进行抛弃代码如下Linklist L_bat; Initlist(L_bat); ifstream employee("employee.txt");//打开txt文件 while (!employee.eof()) { Linklist l; Initlist(l); employee >> l->id >> l->name >>l->sex >>l->phone ; if(L->next!=NULL) { L_bat = L->next; l->next = L->next; } L->next = l; } L->next = L_bat; employee.close();//关闭文件