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;
}