将文本文件数据读入字符数组时提取运算符的歧义
ambiguity with extraction operator while reading a text file data into a character array
#include<iostream>
#include<fstream>
using namespace std;
void main()
{
char word[5];
ifstream file;
file.open("abcd.txt",ios::in);
if(file)
{
while(file>>word)
{
cout<<word<<" ";
}
}
else
cout<<"file not opened";
}
文件内容ABCD.txt:
菠萝橙十七电脑
我得到的输出是:
pineapple orange seventeen computer
我提到数组大小为 5,但 extraction(>>( 运算符将大小大于 5 的单词读取到数组中(但数组大小为 5!这是怎么发生的?.这怎么可能?
我期望的输出是:
pinea orang seven compu
正如 Neil Butterworth 所提到的,>>
运算符无法知道 char 数组何时对于输入来说太小,因此可能会尝试写入数组的末尾。
写入数组末尾会导致未定义的行为。这意味着C++标准没有说明如果您尝试这样做会发生什么。您的程序可能会崩溃,但不能保证。char 数组之后的内存也可能用于其他用途,这将使您的程序行为非常奇怪并且难以调试。当你有未定义的行为时,任何事情都可能发生。
在这种情况下,该程序似乎运气好,因为数组后的内存未使用。但是,如果您使用不同的编译器编译了它或在不同的环境中执行了该程序,则可能会发生我上面提到的一件事。如果还不清楚,您的程序中永远不应该有未定义的行为。
相关文章:
- 在C++中使用重载提取运算符时出现问题
- 使用 istream 提取运算符进行 csv 解析:如何检测缺失的字段值?
- 将文本文件数据读入字符数组时提取运算符的歧义
- 派生类 插入和提取运算符重载以及基类与派生类之间的强制转换
- 长方程加法/减法计算器,从文本文件中提取运算符和数字
- 运算符重载流提取运算符 (>>) C++会导致无限递归流提取
- 无法在C++中过载流提取运算符 (>>)
- 带有指针的重载插入/提取运算符
- 防止为字符串流提取运算符不支持的类型实例化模板类 (>>)
- 为什么我不能对提取运算符进行 decltype
- 是否保证标准提取运算符>>在失败时不会更改参数?
- 提取运算符 (>>) 可以覆盖变量吗?
- 重载提取运算符
- C++ 重载提取运算符 - 无法访问类中声明的私有成员
- 如何在重载提取运算符中读取行(忽略空格字符)
- 如何在C++中重载模板的朋友提取运算符(>>)?
- 两个类的重载提取运算符
- 为什么 cin 提取运算符会导致段错误
- 在派生类中使用提取运算符(>>)的方法以及在C++中处理静态数据成员的方法
- 提取运算符是否删除分隔符