使用打开的文件流访问违规读取位置

时间:2014-06-27 15:22:52

标签: c++ exception

我知道这个问题已被问过很多次了。但是,就我而言,错误并不总是存在,所以我认为它可能会有所不同。我使用的是C ++,Visual Studio 2013,Windows 7 x64。

以下是相关代码:

void writeDATAToFile(const char *fname, string title, const VecDoub& spec_x, const VecDoub& spec_y, const VecDoub& freq)
{
    ofstream of;
    of.open(fname, ios_base::out);
    if (!of.is_open())
    {
        return;
    }
    of << "somename" << endl;
    of << "WAVES/S" << "\t" << title << endl;
    of << "BEGIN" << endl;
    for (int i=0; i<spec_x.size(); i++)
    {
        of << spec_x[i] << "\t\t\t" << spec_y[i] << "\t\t\t" << freq[i]<<endl;
    }
    of << "END" << endl;
    of.close();
}

该函数应该写入频谱数据(在程序中先前计算)并将其写入文件。一些频谱数据不会导致问题,有些会。错误在for循环中。 这是错误窗口:enter image description here

2 个答案:

答案 0 :(得分:2)

您将3个向量传递给您的函数:

const VecDoub& spec_x, const VecDoub& spec_y, const VecDoub& freq

但你永远不会检查它们是否具有相同的尺寸。

在你的循环中(不是你在问题中所说的&#34;第二个&#34;循环,你发布的代码中只有一个循环),你重复{{1并使用相同的索引spec_x来索引其他两个向量。

如果您的另外两个向量中的一个或两个的大小小于i,该怎么办?然后你将索引越界,这会导致你看到的错误。

答案 1 :(得分:1)

错误消息明确表示它正在尝试读取不应该的内容。

你编码循环因此:

 for (int i=0; i<spec_x.size(); i++)
 {
        of << spec_x[i] << "\t\t\t" << spec_y[i] << "\t\t\t" << freq[i]<<endl;
 }

这假定spec_xspec_yfreq的大小相同。

  • 你可以在循环之前检查这个,如果这样就抛出一个错误 前提条件不成立。
  • 你可以循环到这三个中最小的一个。
  • 您可以按原样保留此功能,并将检查放在最初填充数据的位置。

注意 - 调试器正试图帮助您。如果你点击“break”它会给你一个调用堆栈,然后你应该能够确切地看到导致问题的变量。