C++ while 循环没有从我的文件中读取 -1
C++ while loop is not reading -1 from my file
我正在编写一个程序,该程序从.txt文件中读取数字并输出相应数量的星号(对于偶数整数(和美元符号(对于奇数整数(。例如,3 将输出 $$$,2 将输出 **。程序工作正常,除了当它读取数字 -1 时。其他负数工作得很好,除了出于某种原因的-1。
这是我的代码:
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <Windows.h>
using namespace std;
int main()
{
int value, even, odd;
ifstream infile;
infile.open("lab6_input.txt");
while (infile >> value)
{
if (value % 2 == 0)
cout << string(abs(value), "*$"[value % 2]) << endl;
else
cout << string(abs(value), "*$"[value % 2]) << endl;
value++;
}
infile.close();
system("pause");
return 0;
}
这是我的输出:https://i.stack.imgur.com/gmDkS.jpg
输出中的最后一个数字是 -1,但它只显示一个空白区域。
你的代码似乎有点奇怪。您的变量没有初始化,偶数和奇数甚至没有使用。您的 if 语句是不必要的,因为在这两种情况下您都有相同的代码。
对于您的问题: 您应该使用abs(value)
两次。 尝试
while(infile >> value){
cout << string(abs(value), "*$"[abs(value) % 2]) << endl;
value++;
}
现场示例
问题就在这里
"*$"[value % 2]
在C++中,应用于负数的模运算符的结果是负数(嗯,技术上比这复杂一些(。因此,当value
为负数时,该指令会导致未定义的行为,从而越界访问数组(字符串文字((索引-1处
的数组(。您可以解决采用value
或结果的绝对值的问题,但请考虑编写如下所示的自由函数。
constexpr bool is_odd(int x)
{
return x % 2;
}
它将更好地表达意图,并将帮助编译器优化您的代码(例如,请参阅此处(,因为这就像您在询问
告诉我
value
是否可以被 2 整除(除以 2 的余数为零(。
这与
给我
value
除以 2 的其余部分
您可能已经注意到,在链接的编译器资源管理器页面中,编译器最终使用简单的
and edi, 1
而不是执行实际的模运算。这是因为您真正需要的是不太有效的位,您可以直接在代码中使用
value & 1
但请注意,标准(C++17,在我写这篇文章的时候(并没有要求(C++20 需要两个补码(类型int
的特定二进制表示,所以前一个将是实现定义的(如果你碰巧发现一个补码仍然int
实现工作,那就错了(。
- 正在将csv文件读取为双精度矢量
- 将从格式化文本文件读取的文本数据存储到链表
- C++ 读取文件读取文件不正确
- 使用对象文件读取三角形数据网格
- 如何减慢从 BVH 文件读取的 opengl 动画?
- 从文件读取,并写入函数C++中的数组
- 从对象C++中的文件读取内容时出现分段错误
- 从文件读取并通过矢量输出到控制台
- 尝试将字符串从文件读取到无符号字符向量中
- 如何将文本文件读取到二维数组中并以 c++ 打印
- 简化文件读取的函数
- 如何将逗号分隔的文件读取为 2D int 数组?
- 在 c++ 中将数据从文件读取到队列中
- 'std::wstring_convert'尽可能多地转换(从 UTF8 文件读取块)
- C++,从文件读取到结构,然后读取到向量(结构被推入向量太多次,而不仅仅是一次)
- 文件读取C++包括空格键
- 从文件读取时未将值推回矢量
- 从文件 C++ 读取时的无限循环
- 从同一文件读取和写入?
- 从.txt文件读取到C++中的双精度向量