c++primer上做的一道练习题-程序编译没有错-但是运行时就会报错停止-希望可以帮我看看

mhzzzz 2016-10-25 10:49:16
练习题为c++Primer第五版-P287-练习8_7到练习8_8
这两道练习题都出现了编译无错,运行停止的情况。
题目如下
练习8.7: 修改书店程序,将结果保存到一个文件中。将输出文件名作为第二个参数传递给main函数。
练习8.8: 修改上一题的程序,将结果追加到给定的文件末尾。对同一个输出文件,运行程序至少两次,检验数据是否得以保留。

//由于这两题的程序差异很少,所以我只放【练习8.8】的程序

[code=c]    #include <iostream>
#include <fstream>
#include "D:\DEVC++project\project\ex7_13.h"

using std::endl;
using std::cout;
using std::cin;
using std::string;

int main(int argc, char** argv)
{
std::ifstream ifs(argv[1]);
std::ofstream ofs(argv[2], std::ofstream::app);

Sales_data total;
if(read(ifs, total)){
Sales_data trans;
while(read(ifs, trans)){
if(total.isbn() == trans.isbn()){
total.combine(trans);
}
else{
print(cout, total);
total = trans;
}
}
print(cout, total);
}
else{
std::cerr<<"Wrong. "<<std::endl;
}
return 0;
[/code]}

我用的编译器是DEVC++5.11。F9编译无错,F10运行,就会出现【ex8_7.exe已停止工作】的提示框。
想问一下这到底是什么问题,编译器的问题还是程序的问题。
另外,我觉得devc++用着还行,但还是顺便想问一下大家用什么编译器
...全文
181 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xxx_Mrjie_xxx 2016-10-25
  • 打赏
  • 举报
回复
设置断点 进行调试
hongwenjun 2016-10-25
  • 打赏
  • 举报
回复
缺少你的哪个头文件,晚上搜索,直接插入代码了。 可以通过编译,直接运行会错误。 你可以 app.exe a.txt b.txt 这样试试
#include <iostream>
#include <fstream>
#include <ostream>
#include <string>
// #include "D:\DEVC++project\project\ex7_13.h"

using std::endl;
using std::cout;
using std::cin;
using std::string;

using namespace std;

class Sales_data
{
    // 声明友元函数
    friend ostream &print(ostream&, const Sales_data&);
    friend istream &read(istream&, Sales_data&);

public:

    // 构造函数
    Sales_data()
        : bookNo(""), units_sold(0), revenue(0.0)
    {

    }

    // 读取到当前对象中
    Sales_data(istream &is)
    {
        read(is, *this);
    }

    // 返回isbn编号
    string isbn() const
    {
        return bookNo;
    }

    // 返回当前对象的引用
    Sales_data& combine(const Sales_data& rhs)
    {
        units_sold += rhs.units_sold;
        revenue += rhs.revenue;
        return *this;
    }

    // 均价
    double avg_price() const
    {
        if (units_sold) {
            return revenue / units_sold;
        }

        return 0;
    }

private:
    string bookNo; // isbn号码
    unsigned units_sold; // 卖了多少册
    double revenue; // 总收益
};


// 友元函数:传入一个istream对象cin, 一个Sales_data对象, 返回一个istream对象的引用cin, 便于连输输入
istream& read(istream &is, Sales_data &item)
{
    double price = 0;
    is >> item.bookNo >> item.units_sold >> price;
    item.revenue = price * item.units_sold;

    return is;
}


// 友元函数:传入一个ostream对象cout, 一个Sales_data对象, 返回一个ostream对象的引用cout, 便于链式输出
ostream& print(ostream &os, const Sales_data &item)
{
    os << item.isbn() << " " << item.units_sold << " "
       << item.revenue << " " << item.avg_price();

    return os;
}




int main(int argc, char** argv)
{
    std::ifstream ifs(argv[1]);
    std::ofstream ofs(argv[2], std::ofstream::app);

    Sales_data total;
    if (read(ifs, total)) {
        Sales_data trans;
        while (read(ifs, trans)) {
            if (total.isbn() == trans.isbn()) {
                total.combine(trans);
            } else {
                print(cout, total);
                total = trans;
            }
        }
        print(cout, total);
    } else {
        std::cerr << "Wrong. " << std::endl;
    }
    return 0;
}



#if(0)        // 以下不编译


int main()
{
    Sales_data total;
    if (read(cin, total)) { // 读取对象数据, 存入total中, 并返回cin
        Sales_data trans;
        while (read(cin, trans)) { // 读取对象数据, 存入trans中, 并返回cin
            if (total.isbn() == trans.isbn()) { // 判断当前isbn和前一个isbn是否相等
                total.combine(trans);  // 加到当前对象total中
            } else {
                print(cout, total) << endl; // 输出当前对象
                total = trans;  // 更新当前对象
            }
        }

        print(cout, total) << endl; // 输出当前对象(最后的对象)
    } else {
        cerr << "No data?!" << endl; // 最开始就读取失败
    }

    return 0;
}


#endif
小灸舞 2016-10-25
  • 打赏
  • 举报
回复
先单步调试找到出错的地方。
DEVC++使用单步调试和观察变量的步骤:
1. 编译通过(ctrl+F9)
2. 设置断点(ctrl+F5)
3. 调试(F8)
4. 增加观察变量(在左边的debug观察窗口右键增加或者F4)
5. 单步调试:F7
6. 结束调试:ctrl+alt+f2

也可以用VS:http://blog.csdn.net/cometnet/article/details/19551125
paschen 2016-10-25
  • 打赏
  • 举报
回复
在调试下运行程序,出错了点中断,断下来通过调用堆栈定位到相关代码,观察分析原因
ipqtjmqj 2016-10-25
  • 打赏
  • 举报
回复
肯定是程序问题,“已停止运行“错误原因一般都是内存非法访问。
赵4老师 2016-10-25
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
淡忘瞬间dream 2016-10-25
  • 打赏
  • 举报
回复
程序逻辑问题
mhzzzz 2016-10-25
  • 打赏
  • 举报
回复
4楼,我找不到怎么楼层回复了。。。。 我有两个txt文件,一个是读出的,一个是写入的,应该是可以运行程序,在窗口输入两个文件的路径,然后执行读写的,但是一运行就报错停止运行,没有办法去提供txt文档。另外,我的程序因为报错,没有生成可执行文件。 【你可以 app.exe a.txt b.txt 这样试试 】,你应该也是这个意思吧。 理解有误的话,希望你再细说一下

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧