C++ 文本文件中的整数
所以我需要编写一个程序,生成文本文件中所有以空格分隔的整数的总和。 到目前为止,我的代码是这样的C++ 文本文件中的整数,c++,file,C++,File,所以我需要编写一个程序,生成文本文件中所有以空格分隔的整数的总和。 到目前为止,我的代码是这样的 #include "std_lib_facilities.h" int main() { int sum = 0; char text; ifstream txtfile; txtfile.open("intfile.txt"); if (!txtfile) { cout << "Unable to open file";
#include "std_lib_facilities.h"
int main()
{
int sum = 0;
char text;
ifstream txtfile;
txtfile.open("intfile.txt");
if (!txtfile) {
cout << "Unable to open file";
exit(1);
}
while (txtfile >> text ){
if (txtfile){
sum = sum + text;
}else if (txtfile.fail()){
txtfile.clear();
for (char text;txtfile>>text && !isdigit(text);)
{};
}
}
txtfile.close();
cout << "Sum = " << sum << endl;
return 0;
}
我的问题是为什么我的输出是Sum=2019。另外,我没有任何错误,所以我不知道有什么不对。 < p>你需要检查读入字符是否是一个数字,因为C++中的char类型如果你对它进行数字运算,就隐式转换为它的ASCII值。 由于数字的ASCII值与实际值之间存在差异,因此需要减去表中的第一个数字“0”
#include <iostream>
#include <fstream>
#include <cctype>
int main()
{
int sum = 0;
char text;
std::ifstream txtfile;
txtfile.open("../intfile.txt");
if (!txtfile.is_open()) {
std::cout << "Unable to open file" << std::endl;
exit(1);
}
while (txtfile >> text ){
if (txtfile && isdigit(text)){ // check if character is a digit
sum += text - '0'; // take into account the ASCII table offset
}else if (txtfile.fail()){
txtfile.clear();
for (char text;txtfile>>text && !isdigit(text);)
{};
}
}
txtfile.close();
std::cout << "Sum = " << sum << std::endl;
return 0;
}
#包括
#包括
#包括
int main()
{
整数和=0;
字符文本;
std::ifstream txtfile;
打开(“../intfile.txt”);
如果(!txtfile.is_open()){
std::cout(文本){
if(txtfile&&isdigit(text)){//检查字符是否为数字
sum+=text-'0';//考虑ASCII表偏移量
}else if(txtfile.fail()){
txtfile.clear();
对于(char text;txtfile>>text&&!isdigit(text);)
{};
}
}
txtfile.close();
std::cout这是一个使用调试器逐步检查代码的绝佳机会。如果您不知道如何使用调试器,我们可以给您一些提示。提示:'b'+'e'+'a'+'r'==525
。如果您了解Python,您会注意到sum(在“bears:17elephants9end”中用ord(c)表示c)=2019</CODE,即,您在文件中的字符的ASCII值求和。<代码>(TxTfile >文本)< /C> > <代码>字符文本;< /C> >将读取任何字符(在文件结束之前失败的机会较少)。然而,在C++中,<代码> char < /代码>被认为是积分类型。因此,<代码>求和= +文本<代码>将总结所有的(ASCII)读取字符的值。(我没有检查,但我打赌这可以解释2019年的结果。)@Brian Ehem…我得到410:;-)'b'+'e'+'a'+'r'+'s'==525
而不是读取char
,你可以读取std::string
。然后你可以尝试字符串是否包含整数。(如果失败,它会抛出一个您应该捕获的异常。)如果成功,请将值添加到sum
。这有点错误;存储在char
对象中的值只是一个值。如果将其视为字符,则该值可以解释为字符。如果将其视为数值,则它是一个数值。它不会“隐式转换”为ASCII值(或任何其他编码)。当以ASCII编码时,'0'
的值为0x30。char x='0';
将x
的值设置为0x30(如果您的系统使用ASCII)。如果您写入std::cout,请进一步注意:该注释“考虑ASCII表偏移量”在使用ASCII的系统上是正确的。但更一般地说,在所有系统上,text-'0'
将始终给出text
中的字符所表示的数值。这不是因为它针对“ASCII表偏移量”进行调整,而是因为它针对正在使用的任何编码中的偏移量进行调整。+1。
#include <iostream>
#include <fstream>
#include <cctype>
int main()
{
int sum = 0;
char text;
std::ifstream txtfile;
txtfile.open("../intfile.txt");
if (!txtfile.is_open()) {
std::cout << "Unable to open file" << std::endl;
exit(1);
}
while (txtfile >> text ){
if (txtfile && isdigit(text)){ // check if character is a digit
sum += text - '0'; // take into account the ASCII table offset
}else if (txtfile.fail()){
txtfile.clear();
for (char text;txtfile>>text && !isdigit(text);)
{};
}
}
txtfile.close();
std::cout << "Sum = " << sum << std::endl;
return 0;
}