【问题标题】:Using a for loop to modify string name when reading data读取数据时使用for循环修改字符串名称
【发布时间】:2016-03-10 03:13:35
【问题描述】:

我这部分代码的思路比较简单;我正在做一个迭代某个整数范围的for循环,迭代的值放在数字到字符串的转换中,然后在for循环中调用以读取数据文件。

代码sn-p:

for (int z = 11; z < 33; z++) {
        const std::string filename_1 = "detection";

        int value = z;
        std::string filename_2;
        std::ostringstream convert;
        convert << value;
        filename_2 = convert.str();

        const std::string filename_3 = ".rat";

        const std::string my_file = filename_1 + filename_2 + filename_3;

        // Reading data from the .rat files of the detected signal.
        Reading(my_file, times_det, signal_det);

// Further calculations go here.

代码编译并执行,但在读出两个计算结果后,我返回错误:

./test
0.527679
0.639159
*** Error in `./test': double free or corruption (out): 0x0000000000f52a30 ***
Aborted (core dumped)

我不是在必要的地方清除内存吗?使用 .clear() 并没有消除这个问题。

感谢您的建议!

编辑:为了清楚起见,“阅读”功能:

void Reading(const std::string &filename, rarray<double,1> &times, rarray<std::complex<double>,1> &signal) {
    std::ifstream f(filename.c_str());
    // Read in the signal.
    f >> times;
    f >> signal;
}

【问题讨论】:

  • 乍一看,我不明白这个错误是如何发生的。您确定它不会在 Reading 函数中发生吗?提出问题的最佳实践包括从等式中删除任何未知数。这对您和我们都有帮助,因为我们不必假设/猜测代码中其他地方发生了什么。
  • 检查您连续两次打开/关闭同一个文件的阅读功能。你提供的sn-p没有问题
  • 感谢您的意见。我已经修改了我的原始帖子以包含函数的定义,希望这将有助于澄清事情。
  • @Kam 现在还有更多我不知道的!这是什么rarray?你知道这不是对rarray,或者你对times_detsignal_det 的处理吗?您应该真正将代码减少到重现您的问题的最小示例。仅此一项就可以让您找到答案,并让我们自己尝试代码。
  • @KenWayneVanderLinde rarray 只是我用来生成数组的库; times_det 和 signal_det 是我创建的用于传递函数的数组。代码在没有 for 循环的情况下工作得很好;唉,我将尝试简化问题,看看是否可以缓解。再次感谢您的意见!

标签: c++ string for-loop


【解决方案1】:

@kam,我尝试使用以下代码重现该问题,我怀疑它可能与您正在使用的 rarrays 有关,但由于我没有您所使用的库的详细信息而被注释掉正在使用。

#include <iostream>
#include <fstream>
#include <strstream>
#include <sstream>

using namespace std;

void Reading(const std::string &filename, /*rarray< */double /*,1> */ &times, /* rarray<std::complex< */ double /*>,1> */ &signal) {
    std::ifstream f(filename.c_str());
    // std::ifstream f;
    std::string ofile = "o_" + filename;
    std::ofstream o;

    //f.open(filename.c_str());
    o.open(ofile.c_str());

    // Read in the signal.
    f >> times;
    f >> signal;

    cout << "file open :" << f.is_open() << " ";
    cout << times << " " << signal << endl << flush;

    //o << "file open :" << f.is_open() << " ";
    o << times << " " << signal << endl << flush;

    //f.close();
    o.close();
}


int main(int argc, const char * argv[]) {
    const std::string filename_1 = "detection";
    const std::string filename_3 = ".rat";
    double times_det = 0.0, signal_det = 0.0;

    for (int z = 11; z < 33; z++) {
        int value = z;
        std::string filename_2;
        std::ostringstream convert;

        convert << value;
        filename_2 = convert.str();

        const std::string my_file = filename_1 + filename_2 + filename_3;

        // Reading data from the .rat files of the detected signal.
        Reading(my_file, times_det, signal_det);

        // Further calculations go here.
    }

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    相关资源
    最近更新 更多