为什么c++;在python不可用时排除\n 编写了一个小写代码,输出了C++和Python中ASCII值的总和,给出了一个输入文件。 C++块似乎排除了\n,而Python块确实包含了“\n”作为其计算的一部分,对于相同的输入文本文件。

为什么c++;在python不可用时排除\n 编写了一个小写代码,输出了C++和Python中ASCII值的总和,给出了一个输入文件。 C++块似乎排除了\n,而Python块确实包含了“\n”作为其计算的一部分,对于相同的输入文本文件。,c++,python,C++,Python,我想知道我的代码中是否有我忽略的步骤 代码块: import sys try: f=open(sys.argv[1]).read() except: print " file not found \n" sys.exit() sum=0 for line in f: for character in line: try: if character=='

我想知道我的代码中是否有我忽略的步骤

代码块:

    import sys

    try:
         f=open(sys.argv[1]).read()
    except:
        print " file not found \n"  
        sys.exit()
    sum=0
    for line in f:
       for character in line:
          try:
        if character=='\n':
            pass
        else:
            print character
            sum+=ord(character)

    except:
        print "failed \n"
        pass


     print "The sum is %d \n" %sum
<>和C++块是:

    #include "iostream"
    #include "fstream"
    #include "string"
    int k;
    int main(int argc, char *argv[])
    {
    int sum=0;
    std::string line;
    std::ifstream myfile (argv[1]);
    if (myfile.is_open())
      {while (myfile.good())
        {
        getline (myfile,line);
        for (k=0;k<(line.length());k++)
            {
                sum=sum+int(line[k]);
            }
    }
std::cout<<" The total sum is : " <<sum<<std::endl;
}
  else std::cout<< "Unable to open file ";
  return 0;
  }
#包括“iostream”
#包括“fstream”
#包括“字符串”
int k;
int main(int argc,char*argv[])
{
整数和=0;
std::字符串行;
std::ifstream myfile(argv[1]);
如果(myfile.is_open())
{while(myfile.good())
{
getline(myfile,line);

对于(k=0;k,默认情况下,
ifstream::getline
使用
'\n'
作为行尾的分隔符。它丢弃了分隔符,因此您看到的是您所期望的。

根据
std::getline()
[string.io]§7的规范:

从is中提取字符并将其附加到str…直到 发生以下情况:

  • traits::下一个可用输入字符c的eq(c,delim)(在这种情况下,c是提取的,但不是附加的
(我的重点)

这意味着当
getline
遇到分隔符时(
\n
默认情况下),它会将其从流中删除,但不会将其存储在字符串中


至于直接回答你的“为什么”问题:因为它就是这样设计的。

你的Python代码没有做你认为它正在做的事情。你正在将整个文件读入字符串
f
,然后对它进行迭代,生成单字符字符串而不是行

但是,即使您使用了正确的方法并使用了
readlines
或直接迭代了file对象,您仍然会遇到保留尾随换行符的问题。原因是:

f.readline()
从文件中读取一行;换行符(\n)保留在字符串的末尾,只有当文件没有换行符结尾时,才会在文件的最后一行忽略。这使得返回值明确无误;if
f.readline()
返回一个空字符串,即已到达文件末尾,而空行由“\n”表示,该字符串仅包含一个换行符


C++使用了不同的信令结尾的方法,所以不需要保留这个区别,并且可以自由地丢失尾行。这通常比较方便。

它们是不同的语言,它们具有不同的规范和不同的库,为什么你会期望它们工作相同?你的C++代码会计算最后一个LIN。两次删除文本文件。旁白:永远不要使用
.eof()
.good()
作为循环构造。它几乎总是产生错误代码,就像在您的示例中一样。@segfolt原因是我的评论。
good
不能很好地指示下一次提取是否成功。事实上,在这种情况下,将读取最后一行并提取最终的
\n
但不会设置错误位。下一次迭代将尝试提取另一行,但没有。@segfolt惯用的方法是
while(std::getline(myfile,line))…