注册 登录
编程论坛 C++教室

请问下面的错误 输出内存不能读取 不知道哪个指针有问题

万士心平 发布于 2011-10-11 15:40, 1705 次点击
只有本站会员才能查看附件,请 登录
   

    #include<iostream>
    #include<fstream>

    ofstream oFile;

    oFile.open("c:\\salary.dat",ios::out);

    char id[8];
    char name[20];
    double salary;
    double fee;
    double bonus;
    double delsalary;
    double realsalary;
    oFile<<"职工编号"<<"\t姓名"<<"\t基本工资"<<"\t奖金"<<"\t扣除"<<endl;
    for(int i=0;i<3;i++){
   
        cout<<"请输入员工编号: "; cin>>id;
        cout<<"请输入姓名: "; cin>>name;
        cout<<"请输入基本工资: "; cin>>salary;
        cout<<"请输入加班工资: "; cin>>fee;
        cout<<"请输入奖金: "; cin>>bonus;
        cout<<"请输入扣除: " ; cin>>delsalary;

        oFile<<id<<" "<<name<<" "<<salary<<" "<<fee<<" "<<bonus<<" "<<delsalary<<endl;
        }
    oFile.close();


    /*读取文件*/
    ifstream iFile;
   
    iFile.open("c:\\salary.dat",ios::in);

    cout<<"职工编号"<<"\t姓名"<<"\t基本工资"<<"\t奖金"<<"\t扣除"<<"\t实发工资"<<endl;
   
    while(!iFile.eof()){
   
        
        iFile>>id>>" ">>name>>" ">>salary>>" ">>fee>>" ">>bonus>>" ">>delsalary;
        
        realsalary=salary+bonus+fee-delsalary;//计算实发工资

        cout<<id<<"\t"<<name<<"\t"<<salary<<"\t"<<fee<<"\t"<<bonus<<"\t"<<delsalary<<"\t"<<realsalary<<endl;
        
        }
    iFile.close();
    }

在输入的时候没有问题 读取文件时候就输出一个 cout输出的文件 下面读取不了

 
11 回复
#2
naruto012011-10-11 17:52
iFile>>id>>" ">>name>>" ">>salary>>" ">>fee>>" ">>bonus>>" ">>delsalary;
iFile输出给" ",自然会引发内存访问错误。

#3
naruto012011-10-11 17:53
另外,这句代码欠缺一些考虑
#4
万士心平2011-10-11 21:26
回复 3楼 naruto01
非常感谢! 确实有点欠缺考虑! 空格属于常字符串 怎么能被赋值。。

  还有那什么为什么我的修改后 没有出现内存错误问题
但是且一直循环输出。。
程序代码:
    ofstream oFile;

    oFile.open("c:\\salary.dat",ios::out|ios::binary);

    char id[8];
    char name[20];
    double salary;
    double fee;
    double bonus;
    double delsalary;
    double realsalary;
    oFile<<"职工编号"<<"\t姓名"<<"\t基本工资"<<"\t奖金"<<"\t扣除"<<endl;
    for(int i=0;i<1;i++){
   
        cout<<"请输入员工编号: "; cin>>id;
        cout<<"请输入姓名: "; cin>>name;
        cout<<"请输入基本工资: "; cin>>salary;
        cout<<"请输入加班工资: "; cin>>fee;
        cout<<"请输入奖金: "; cin>>bonus;
        cout<<"请输入扣除: " ; cin>>delsalary;

        oFile<<id<<" "<<name<<" "<<salary<<" "<<fee<<" "<<bonus<<" "<<delsalary<<endl;

        }
    oFile.close();


    /*读取文件*/
    ifstream iFile;
   
    iFile.open("c:\\salary.dat",ios::in|ios::binary);

    cout<<"职工编号"<<"\t姓名"<<"\t基本工资"<<"\t奖金"<<"\t扣除"<<"\t实发工资"<<endl;
   
    while(!iFile.eof()){
   
      
        iFile>>id>>name>>salary>>fee>>bonus>>delsalary;
      
        realsalary=salary+bonus+fee-delsalary;//计算实发工资

        cout<<id<<"\t"<<name<<"\t"<<salary<<"\t"<<fee<<"\t"<<bonus<<"\t"<<delsalary<<"\t"<<realsalary<<endl;
      
        }
    iFile.close();
    }

只有本站会员才能查看附件,请 登录

   




[ 本帖最后由 万士心平 于 2011-10-11 21:34 编辑 ]
#5
naruto012011-10-11 22:30
if(iFile.fail())
     break;
在while循环体中加入
#6
naruto012011-10-11 22:44
避免读取最后一行两次的问题
循环判断条件改为
while( iFile>>id>>name>>salary>>fee>>bonus>>delsalary )
#7
万士心平2011-10-11 23:43
谢谢! 请问是两个一起还是一个就可以!  我两种都试了 也是有错误啊! 希望继续帮忙! 不胜感激
#8
naruto012011-10-12 00:14
两种一起吧
oFile<<"职工编号"<<"\t姓名"<<"\t基本工资"<<"\t奖金"<<"\t扣除"<<endl;
考虑解决下这个吧。
如果有问题,那应该就是职工编号和姓名这了
#9
万士心平2011-10-12 00:47


thanks very much! 可以了!  那个oFile在上面也写进了文件,   下面读取的时候都把字符串乱赋值给其它变量了 比如bonus fee 等呵呵 非常感谢!
 
 那个为何会输出两行呢? 因为只要求写进一个 人的资料, 第一次inFile>>后      iFile.eof() 应该返回的是非0值啊 ?
 
为何循环还会再执行一次呢?  加入了您说的判断加入 iFile.fail() 成立就Break 以及用iFile>>id>>name>>salary>>fee>>bonus>>delsalary 就不会出错

只输出一行;再次谢谢回答!

出错情况图片:

  

只有本站会员才能查看附件,请 登录
#10
万士心平2011-10-12 00:52
而且我在循环内最后加入一行

    cout<<iFile.eof()<<endl;


输出的是0 。
#11
naruto012011-10-12 02:09
网上查下关于类似上面死循环的资料,解决方法是需要clear一下,我也看了下关于eof作为循环结束的资料,用百度应该很容易找到
下面是我的理解
先说下死循环的问题,那肯定就是!iFile.eof()永远为真,其实情况可能是两种:1,没有到达文件末尾 2,iFile流状态错误,不能再进行读写。这个死循环应该是第二种情况造成的,所以需要判断fail位,来作为跳出条件。可能也需要判断bad位,我也是初学,没实际用过。所以网上说的clear,也就是清除了流的错误状态,也就可以正常判断eof了。
改循环条件,也是参看了网上的资料http://larrycheung.blog.,里面介绍了eof的判断方式,为了避免多重复输出最后一行的问题,那么可以用iFile流是否是有效的作为判断条件,当然,那个条件可以简化的。


可能我想的也有错误,也是自己查资料想的,毕竟没啥经验。  建议你多独立思考下,多考虑下自己的代码,应该可以迎刃而解,对自己的技术也是一种提高,这是对你的建议,也是对我自己的忠告。

[ 本帖最后由 naruto01 于 2011-10-12 02:14 编辑 ]
#12
万士心平2011-10-12 13:02
谢谢你! 看了那个空间的文章觉得有收获了!  按照修改了下程序,果然可以安全通过 ,执行成功! 谢谢!
1