C++ while 循环没有从我的文件中读取 -1

C++ while loop is not reading -1 from my file

本文关键字:文件 读取 我的 while 循环 C++      更新时间:2023-10-16

我正在编写一个程序,该程序从.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实现工作,那就错了(。