混合ifstream getline和>>
Mixing ifstream getline and >>
使用>>
输入float
值后,getline将停止正常工作并读取垃圾。我该如何避免这种情况?
string settingsFile = "TerrainSettings.txt";
ifstream settingsStream;
settingsStream.open(settingsFile.data());
assert (settingsStream.is_open());
string line;
getline(settingsStream,line); // fine here
getline(settingsStream,line); // fine here
getline(settingsStream,line); // fine here
float frequency;
float octaves;
float amplitude;
settingsStream>>frequency; // fine here
getline(settingsStream,line); // here it gets trash, why?
settingsStream>>octaves; // trash
getline(settingsStream,line);
settingsStream>>amplitude;
编辑:包含ignore(),会生成以下错误:
settingsStream>>frequency;
settingsStream.ignore(256,'n');
getline(settingsStream,line); // fine here
settingsStream>>octaves; // trash here
getline(settingsStream,line);
settingsStream>>amplitude;
样本输入:
/*Settings for Terrain Rendering, please input values on their respective lines*/
/**/
Frequency:
24
Octaves:
120
Amplitude:
1.25
首先,开始使用std::string
s和std::getline
。其次,丢弃的原因是缓冲区中仍然有一条换行符。如果希望用户一次一行地输入值,则应使用istream::ignore
跳过所有内容,直到并包括下一个换行符。例如:
std::string s;
float f;
std::cin >> f;
std::cin.ignore(big_num, 'n');
std::getline(std::cin, s);
big_num
应该是什么取决于您对输入的期望。如果你不介意写很多东西,并且希望安全起见,可以使用std::numeric_limits<std::streamsize>::max()
。如果你确实介意写很多东西,那么就用一个合适类型的常数,在任何地方都可以使用。
例如,上面的代码将解析以下内容,使f = 5.0f
、s = Hello!
。
5
Hello!
然而,它将以完全相同的方式解析以下内容:
5 Hi!
Hello!
如果你想保留Hi!
,你不应该忽略它,而是定义一个合适的语法来解析文档。
相关文章:
- ifstream什么都没读
- EASTL矢量<向量<int>>连续的
- ifstream文件在从行中读取时被清除
- std::ifstream::read 不会读取所有 512 字节,并设置 EOF 和失败位
- 将 ifstream 拆分为 n 个流?
- 如何将 std::ifstream 转换为 std::basic_istream<CharT, Traits>&?
- 我在 ifstream input_file(文件名)行中收到错误"no matching function to call";
- 尝试打开 ifstream 时出现"Incomplete type"错误
- 是否可以在没有真实文件的情况下创建 ifstream
- 虽然循环不读取整个 ifstream 文件
- std::ifstream 在读取文件中最后一项时设置 eofbit,但仅在读取数值类型时发生
- Ofstream和IFSTREAM有什么区别?
- 如何将QByteArray转换为std::istream或std::ifstream?
- ifstream 跳过数字,只写 0
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- 在函数中声明的 ifStream 对象在发布模式下不起作用
- fstream / ifstream / ofstream 对象如何转换为布尔值
- ifstream 尝试读取 9 到 13 之间的无符号字符时非常奇怪的行为
- 尝试在 C++ 中为 ifstream 提供一个变量
- ifstream 读取的字符与文件中写入的字符不同