事情起因

帮朋友修改她的数据结构课设时,整体都几乎完善了,但运行过程中会莫名其妙地崩溃。检查了一下代码,几乎没有问题,编译器编译也是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();

调查

查阅资料得知:

通过eof()判断文件结束,若某行只有回车也算是一行,即使在文件尾部

运行几次也是可以验证,就是数据导出时的换行符生成的新行影响了数据读取,进而导致乱码。

处理

目前个人想到的一个处理过程就是:

对最后一行"多余"的数据进行抛弃

代码如下

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();//关闭文件
最后修改:2022 年 05 月 19 日
要不?请我吃一下沙县连锁大酒店?