C ++ - 我在调试器中看到不正确的值(MS VS 2015)

时间:2016-05-08 19:37:13

标签: c++ fstream

我第一次使用C ++文件流。我有一个问题 (Windows 8.1 x64,MS VS 2015,但mscrt v.120(来自MS VS 2013)x64)

fin >> m行之后,m等于0xccccccccccc,但必须等于570

函数fscanf正常工作并返回m=570
函数std::getline (fin, line)也返回line="570"

跟随第一个int的双打将被读得很好。

编辑:我不会尝试通过printf检查变量的值。

为什么输入操作符不按预期工作?  我不明白的是什么?

  #include <string>
  #include <fstream>
  #define WIN32_LEAN_AND_MEAN
  #define _UNICODE
  #include <windows.h>
  #include <tchar.h>

  typedef std::basic_string<TCHAR> tstring;

  size_t  m;
  tstring filename;
  // --------------------------------
  std::ifstream  fin (filename, std::ios_base::in);
  if ( fin.is_open () )
  {
    if ( fin >> m )  // !!!
    { angles.resize (m); }
    else
    { throw std::exception ("ifstream error"); }

    double angle = 0.;
    while ( fin >> angle )
    { angles.push_back (angle); }

    double angle = 0.;
    while ( fin >> angle )
    { angles.push_back (angle); }
    // --------------------------------
    size_t m = angles.size (); / <--- HERE 
    //  is the DEFINITION of the new variable with the same name.
    //  It is created on a stack, so before it's been initialized,
    //  it has the value = 0xcccccccc.
    frames.resize (m);
    // --------------------------------
    for ( size_t i = 1U; i < m; ++i )
    { frames[i] = i; }
    // --------------------------------
  }
  else
  { throw std::exception ("ifstream: input error."); }
}

文本文件不包含BOM或其他内容...... 这是二进制视图:

Binary view of input data

3 个答案:

答案 0 :(得分:-2)

使用browser found peer打开文件时,文件名参数必须是std::ifstream类型的C字符串。

我还建议您使用const char*或仅使用常规std::basic_string<TCHAR>.c_str()

答案 1 :(得分:-3)

由于我在评论中写错了: MS VS Debugger内部变量中的问题。正如所料,这是我的错。

调试器中变量的值不正确我只能在DEBUG版本中看到。 在RELEASE中,变量在调试器中具有正确的值。

因此,解决方案是重命名变量以在调试器中查看正确的值。

函数的所有代码:

{
  std::ifstream  fin (filename, std::ios_base::in);
  // --------------------------------
  if ( fin.is_open () )
  {
    size_t  m;
    if ( fin >> m ) // << 0xccccccccc
    { angles.reserve (m); }
    else
    { throw std::exception ("ifstream: input error."); }

    double angle = 0.;
    while ( fin >> angle )
    { angles.push_back (angle); }
    // --------------------------------
    size_t m = angles.size (); // <--- HERE 
    //  is the DEFINITION of the new variable with the same name.
    //  It is created on a stack, so before it's been initialized,
    //  it has the value = 0xcccccccc. That I can see.
    frames.resize (m);
    // --------------------------------
    for ( size_t i = 1U; i < m; ++i )
    { frames[i] = i; }
    // --------------------------------
  }
  else
  { throw std::exception ("ifstream: input error."); }
}

答案 2 :(得分:-6)

我建议你将m变量的数据类型更改为int,因为函数size()根据我的知识返回一个整数,并将数字存储在变量m中。然后使用以下语法创建数据类型为size_t的变量测试:size_t test = m。如果是调试器的错误,请尝试使用sizeof()而不是size_t数据类型。这意味着前面的内容可以写成:sizeof(m)并将其存储在变量中。我希望我能帮助你。