我第一次使用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或其他内容...... 这是二进制视图:
答案 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)并将其存储在变量中。我希望我能帮助你。