【问题标题】:C++ Code Dumping "random" dataC++ 代码转储“随机”数据
【发布时间】:2014-06-17 17:31:46
【问题描述】:

首先我会说我是一个相当新的 C++ 程序员。 不过我懂 PHP 和 VBA,所以对编程基础的各个方面都有很好的了解。

因为我在日常工作中经常使用 CSV,所以我认为编写一个操作 CSV 文件的库是一个很好的学习练习。

我写了这个函数:

int getHeaders(ifstream & os, vector<string> & head2){
    string STRING;
    getline(os,STRING);
    cout << STRING << endl;
    STRING.erase(remove(STRING.begin(), STRING.end(), '\"'), STRING.end());
    string::iterator it = STRING.begin();
    int x = 0;
    for (int index = 0; it < STRING.end(); it++, index++) {
        if (*it == ',') {
            head2.push_back(STRING.substr(0,index));
            STRING.erase(0,index+1);
            cout << endl << head2[x];
            cout << endl << STRING;
            x++;
        }
    }
    return head2.size();
}

由以下调用:

int addRowCount = 0;
vector<string> head1;

ifstream outfile;
outfile.open("default.csv", ios_base::app);

cout << getHeaders(outfile, head1) << endl;
cout << head1[0] << endl << head1[1] << endl;

但是当我运行程序时,程序只是将一堆随机垃圾转储到控制台(并使应用程序崩溃) 我使用的是 windows,所以不能使用 valgrind。

有谁知道为什么会发生这种情况?显然这个“转储”不是我希望应用程序做的。我希望有人能指出我的代码中会导致这种情况发生的部分。

提前致谢。

【问题讨论】:

  • 你觉得这有什么关系?我没有使用任何结构。请记住,我是 C++ 新手,只是在寻找一些指针?
  • @rhysowen 当default.csv 在正确的目录中找不到时,你的程序会做什么?
  • @Drew Dormann 目前,什么都没有,因为我目前处于“概念”阶段。但是“default.csv”确实存在(事实上,该程序的另一部分创建并写入了它)
  • @rhysowen '你觉得这有什么关系?'检查这个关于读取字符分隔文本格式的抽象的答案:stackoverflow.com/a/23070803/1413395

标签: c++ windows mingw codeblocks dump


【解决方案1】:

当您对字符串调用擦除时,该字符串的迭代器将失效,因此在调用STRING.erase() 之后使用it 是错误的。

提示:当您查看支持迭代器的类的方法的文档时,请留意有关使迭代器无效的说明。例如,在this page 上,阅读标题为Iterator validity 的部分

[与答案无关,而是样式问题:在 C 和 C++ 中,对像 STRING 这样的变量名使用全大写通常被认为是不好的样式。所有大写名称都用于#defined 符号]

【讨论】:

    【解决方案2】:

    所以结果表明没有设置 head2[1],所以这是某种内存泄漏。

    这是对 cme​​ts 部分中的建议进行一些进一步修改后完成的函数:

    int getHeaders(ifstream & os, vector<string> & head2){
        string STRING;
        getline(os,STRING);
        STRING.erase(remove(STRING.begin(), STRING.end(), '\"'), STRING.end());
        int strle = count(STRING.begin(),STRING.end(), ',') + 1;
        for(int x = 0; x != strle; x++){
            if (count(STRING.begin(), STRING.end(), ',') > 0) {
                head2.push_back(STRING.substr(0,STRING.find_first_of(',')));
            } else {
                head2.push_back(STRING.substr(0,STRING.length()));
            }
            STRING.erase(0,STRING.find_first_of(',')+1);
        }
        return head2.size(); 
    }
    

    【讨论】:

    • 如果人们要否决这个答案,你至少能告诉我为什么吗?
    • 如果您有兴趣提高您的 C++ 技能,我建议您在Code Review Stack Exchange 上发布您的工作 代码。另外,如果你还没有,我会看看this answer 的第一个sn-p 代码。这是一种更清洁的方式来做你想做的事情。
    • @jliv902 我不知道代码审查堆栈交换!肯定会开始使用它。当我开始回顾我的功能的复杂性时,与其他问题的链接也将证明非常有用。干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多